{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "9479e08c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from matplotlib import pyplot as plt\n",
    "from sklearn.model_selection import cross_val_score, train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58148b0b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a0cf39ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "font = {\n",
    "    'family': 'Microsoft Yahei', \n",
    "    'weight': 'bold', \n",
    "    'size': 12\n",
    "}\n",
    "plt.rc('font', **font)\n",
    "plt.rc('axes', unicode_minus=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f056ef7",
   "metadata": {},
   "source": [
    "# 1. 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "701f702f",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>信用额度</th>\n",
       "      <th>性别</th>\n",
       "      <th>教育</th>\n",
       "      <th>婚姻状况</th>\n",
       "      <th>年龄</th>\n",
       "      <th>10月还款</th>\n",
       "      <th>9月还款</th>\n",
       "      <th>8月还款</th>\n",
       "      <th>7月还款</th>\n",
       "      <th>6月还款</th>\n",
       "      <th>...</th>\n",
       "      <th>7月的账单金额</th>\n",
       "      <th>6月的账单金额</th>\n",
       "      <th>5月的账单金额</th>\n",
       "      <th>10月支付金额</th>\n",
       "      <th>9月支付金额</th>\n",
       "      <th>8月支付金额</th>\n",
       "      <th>7月支付金额</th>\n",
       "      <th>6月支付金额</th>\n",
       "      <th>5月支付金额</th>\n",
       "      <th>是否违约</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>20000</td>\n",
       "      <td>女</td>\n",
       "      <td>研究生</td>\n",
       "      <td>已婚</td>\n",
       "      <td>24</td>\n",
       "      <td>还款延迟二个月</td>\n",
       "      <td>还款延迟二个月</td>\n",
       "      <td>按时还款</td>\n",
       "      <td>按时还款</td>\n",
       "      <td>提前还款</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>689</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>120000</td>\n",
       "      <td>女</td>\n",
       "      <td>研究生</td>\n",
       "      <td>未婚</td>\n",
       "      <td>26</td>\n",
       "      <td>按时还款</td>\n",
       "      <td>还款延迟二个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>...</td>\n",
       "      <td>3272</td>\n",
       "      <td>3455</td>\n",
       "      <td>3261</td>\n",
       "      <td>0</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>0</td>\n",
       "      <td>2000</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>90000</td>\n",
       "      <td>女</td>\n",
       "      <td>研究生</td>\n",
       "      <td>未婚</td>\n",
       "      <td>34</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>...</td>\n",
       "      <td>14331</td>\n",
       "      <td>14948</td>\n",
       "      <td>15549</td>\n",
       "      <td>1518</td>\n",
       "      <td>1500</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>1000</td>\n",
       "      <td>5000</td>\n",
       "      <td>否</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>50000</td>\n",
       "      <td>女</td>\n",
       "      <td>研究生</td>\n",
       "      <td>已婚</td>\n",
       "      <td>37</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>...</td>\n",
       "      <td>28314</td>\n",
       "      <td>28959</td>\n",
       "      <td>29547</td>\n",
       "      <td>2000</td>\n",
       "      <td>2019</td>\n",
       "      <td>1200</td>\n",
       "      <td>1100</td>\n",
       "      <td>1069</td>\n",
       "      <td>1000</td>\n",
       "      <td>否</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>50000</td>\n",
       "      <td>男</td>\n",
       "      <td>研究生</td>\n",
       "      <td>已婚</td>\n",
       "      <td>57</td>\n",
       "      <td>按时还款</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>按时还款</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>还款延迟不到一个月</td>\n",
       "      <td>...</td>\n",
       "      <td>20940</td>\n",
       "      <td>19146</td>\n",
       "      <td>19131</td>\n",
       "      <td>2000</td>\n",
       "      <td>36681</td>\n",
       "      <td>10000</td>\n",
       "      <td>9000</td>\n",
       "      <td>689</td>\n",
       "      <td>679</td>\n",
       "      <td>否</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     信用额度 性别   教育 婚姻状况  年龄      10月还款       9月还款       8月还款       7月还款  \\\n",
       "0   20000  女  研究生   已婚  24    还款延迟二个月    还款延迟二个月       按时还款       按时还款   \n",
       "1  120000  女  研究生   未婚  26       按时还款    还款延迟二个月  还款延迟不到一个月  还款延迟不到一个月   \n",
       "2   90000  女  研究生   未婚  34  还款延迟不到一个月  还款延迟不到一个月  还款延迟不到一个月  还款延迟不到一个月   \n",
       "3   50000  女  研究生   已婚  37  还款延迟不到一个月  还款延迟不到一个月  还款延迟不到一个月  还款延迟不到一个月   \n",
       "4   50000  男  研究生   已婚  57       按时还款  还款延迟不到一个月       按时还款  还款延迟不到一个月   \n",
       "\n",
       "        6月还款  ... 7月的账单金额  6月的账单金额  5月的账单金额  10月支付金额  9月支付金额  8月支付金额  7月支付金额  \\\n",
       "0       提前还款  ...       0        0        0        0     689       0       0   \n",
       "1  还款延迟不到一个月  ...    3272     3455     3261        0    1000    1000    1000   \n",
       "2  还款延迟不到一个月  ...   14331    14948    15549     1518    1500    1000    1000   \n",
       "3  还款延迟不到一个月  ...   28314    28959    29547     2000    2019    1200    1100   \n",
       "4  还款延迟不到一个月  ...   20940    19146    19131     2000   36681   10000    9000   \n",
       "\n",
       "   6月支付金额  5月支付金额  是否违约  \n",
       "0       0       0     是  \n",
       "1       0    2000     是  \n",
       "2    1000    5000     否  \n",
       "3    1069    1000     否  \n",
       "4     689     679     否  \n",
       "\n",
       "[5 rows x 24 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_excel('个人消费贷是否违约.xlsx')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "06b8c9b8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "682f35f9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 30000 entries, 0 to 29999\n",
      "Data columns (total 24 columns):\n",
      " #   Column    Non-Null Count  Dtype \n",
      "---  ------    --------------  ----- \n",
      " 0   信用额度      30000 non-null  int64 \n",
      " 1   性别        30000 non-null  object\n",
      " 2   教育        30000 non-null  object\n",
      " 3   婚姻状况      30000 non-null  object\n",
      " 4   年龄        30000 non-null  int64 \n",
      " 5   10月还款     30000 non-null  object\n",
      " 6   9月还款      30000 non-null  object\n",
      " 7   8月还款      30000 non-null  object\n",
      " 8   7月还款      30000 non-null  object\n",
      " 9   6月还款      30000 non-null  object\n",
      " 10  5月还款      30000 non-null  object\n",
      " 11  10月的账单金额  30000 non-null  int64 \n",
      " 12  9月的账单金额   30000 non-null  int64 \n",
      " 13  8月的账单金额   30000 non-null  int64 \n",
      " 14  7月的账单金额   30000 non-null  int64 \n",
      " 15  6月的账单金额   30000 non-null  int64 \n",
      " 16  5月的账单金额   30000 non-null  int64 \n",
      " 17  10月支付金额   30000 non-null  int64 \n",
      " 18  9月支付金额    30000 non-null  int64 \n",
      " 19  8月支付金额    30000 non-null  int64 \n",
      " 20  7月支付金额    30000 non-null  int64 \n",
      " 21  6月支付金额    30000 non-null  int64 \n",
      " 22  5月支付金额    30000 non-null  int64 \n",
      " 23  是否违约      30000 non-null  object\n",
      "dtypes: int64(14), object(10)\n",
      "memory usage: 5.5+ MB\n"
     ]
    }
   ],
   "source": [
    "# 查看各特征数据类型\n",
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "c5d48cde",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['信用额度',\n",
       " '年龄',\n",
       " '10月的账单金额',\n",
       " '9月的账单金额',\n",
       " '8月的账单金额',\n",
       " '7月的账单金额',\n",
       " '6月的账单金额',\n",
       " '5月的账单金额',\n",
       " '10月支付金额',\n",
       " '9月支付金额',\n",
       " '8月支付金额',\n",
       " '7月支付金额',\n",
       " '6月支付金额',\n",
       " '5月支付金额']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 所有连续特征(数值特征且类别 > 5)\n",
    "lst_col_continuous = []\n",
    "for col in data.columns:\n",
    "    if (len(data[col].unique()) > 5) and (data[col].dtype != 'object'):\n",
    "        lst_col_continuous.append(col)\n",
    "lst_col_continuous"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70a8abb8",
   "metadata": {},
   "source": [
    "# 2. 特征工程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba139836",
   "metadata": {},
   "source": [
    "### (1) 为非数值列编码\n",
    "- 可以发现, 该份数据集中, 除了数据类型为: object的都是数值类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "dd26dbac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['性别', '教育', '婚姻状况', '10月还款', '9月还款', '8月还款', '7月还款', '6月还款', '5月还款', '是否违约']"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 所有非数值列\n",
    "lst_col_obj_1 = []\n",
    "for col in data.columns:\n",
    "    if data[col].dtype == 'object':\n",
    "        lst_col_obj_1.append(col)\n",
    "lst_col_obj_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2f1677df",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "*********\n",
      "**性别**\n",
      "女    18112\n",
      "男    11888\n",
      "Name: 性别, dtype: int64\n",
      "*********\n",
      "**教育**\n",
      "研究生    14030\n",
      "大学     10585\n",
      "高中      4917\n",
      "其他       468\n",
      "Name: 教育, dtype: int64\n",
      "*********\n",
      "**婚姻状况**\n",
      "未婚    16341\n",
      "已婚    13659\n",
      "Name: 婚姻状况, dtype: int64\n",
      "*********\n",
      "**10月还款**\n",
      "还款延迟不到一个月    14737\n",
      "按时还款          5686\n",
      "还款延迟一个月       3688\n",
      "提前还款          2759\n",
      "还款延迟二个月       2667\n",
      "还款延迟三个月        322\n",
      "还款延迟四个月         76\n",
      "还款延迟五个月         26\n",
      "还款延迟八个月         19\n",
      "还款延迟六个月         11\n",
      "还款延迟七个月          9\n",
      "Name: 10月还款, dtype: int64\n",
      "*********\n",
      "**9月还款**\n",
      "还款延迟不到一个月    15730\n",
      "按时还款          6050\n",
      "还款延迟二个月       3927\n",
      "提前还款          3782\n",
      "还款延迟三个月        326\n",
      "还款延迟四个月         99\n",
      "还款延迟一个月         28\n",
      "还款延迟五个月         25\n",
      "还款延迟七个月         20\n",
      "还款延迟六个月         12\n",
      "还款延迟八个月          1\n",
      "Name: 9月还款, dtype: int64\n",
      "*********\n",
      "**8月还款**\n",
      "还款延迟不到一个月    15764\n",
      "按时还款          5938\n",
      "提前还款          4085\n",
      "还款延迟二个月       3819\n",
      "还款延迟三个月        240\n",
      "还款延迟四个月         76\n",
      "还款延迟七个月         27\n",
      "还款延迟六个月         23\n",
      "还款延迟五个月         21\n",
      "还款延迟一个月          4\n",
      "还款延迟八个月          3\n",
      "Name: 8月还款, dtype: int64\n",
      "*********\n",
      "**7月还款**\n",
      "还款延迟不到一个月    16455\n",
      "按时还款          5687\n",
      "提前还款          4348\n",
      "还款延迟二个月       3159\n",
      "还款延迟三个月        180\n",
      "还款延迟四个月         69\n",
      "还款延迟七个月         58\n",
      "还款延迟五个月         35\n",
      "还款延迟六个月          5\n",
      "还款延迟一个月          2\n",
      "还款延迟八个月          2\n",
      "Name: 7月还款, dtype: int64\n",
      "*********\n",
      "**6月还款**\n",
      "还款延迟不到一个月    16947\n",
      "按时还款          5539\n",
      "提前还款          4546\n",
      "还款延迟二个月       2626\n",
      "还款延迟三个月        178\n",
      "还款延迟四个月         84\n",
      "还款延迟七个月         58\n",
      "还款延迟五个月         17\n",
      "还款延迟六个月          4\n",
      "还款延迟八个月          1\n",
      "Name: 6月还款, dtype: int64\n",
      "*********\n",
      "**5月还款**\n",
      "还款延迟不到一个月    16286\n",
      "按时还款          5740\n",
      "提前还款          4895\n",
      "还款延迟二个月       2766\n",
      "还款延迟三个月        184\n",
      "还款延迟四个月         49\n",
      "还款延迟七个月         46\n",
      "还款延迟六个月         19\n",
      "还款延迟五个月         13\n",
      "还款延迟八个月          2\n",
      "Name: 5月还款, dtype: int64\n",
      "*********\n",
      "**是否违约**\n",
      "否    23364\n",
      "是     6636\n",
      "Name: 是否违约, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 查看所有非数值特征各自类别种类分布\n",
    "for col in lst_col_obj_1:\n",
    "    print('***'*3)\n",
    "    print('**' + col + '**')\n",
    "    print(data[col].value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "100b92f5",
   "metadata": {},
   "outputs": [],
   "source": [
    "#性别\n",
    "data['性别'] = data['性别'].apply(lambda x: 0 if x == '女' else 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e92b09ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 婚姻状况\n",
    "data['婚姻状况'] = data['婚姻状况'].apply(lambda x: 0 if x == '未婚' else 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9e9b2c8a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 是否违约\n",
    "data['是否违约'] = data['是否违约'].apply(lambda x: 0 if x == '否' else 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "562fa0ba",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 字典编码\n",
    "def get_code(x, dic):\n",
    "    return dic[x]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "36c0c9d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 教育\n",
    "data['教育'] = data['教育'].apply(lambda x: get_code(x, {'其他': 0, '高中': 1, '大学': 2, '研究生': 3}))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7094102",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "da6b95c0",
   "metadata": {},
   "source": [
    "### (2) 各月的还款情况\n",
    "- 可以先统计每个客户各还款情况次数---->新增衍生列\n",
    "- 然后再对原始字符列进行编码处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ffb78f92",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 统计每个客户各还款情况次数---->新增衍生列\n",
    "# 获得每个用户各还款情况出现次数的Series函数\n",
    "def get_ser_repay_status(x, lst_col_obj_1):\n",
    "    # 通过字典储存还款情况和对应的次数, 并以Series输出方便转发为dataframe\n",
    "    dic_repay_status = {}\n",
    "    for col in lst_col_obj_1[3:-1]:\n",
    "        if x[col] in dic_repay_status:\n",
    "            dic_repay_status[x[col]] += 1\n",
    "        else:\n",
    "            dic_repay_status[x[col]] = 1\n",
    "    return pd.Series(dic_repay_status)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ed50b20e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# apply返回一个series, 会自动变成dataframe;\n",
    "# apply返回一个标量(数值, 字符串), 会自动变成series\n",
    "new_col = data.apply(lambda x: get_ser_repay_status(x, lst_col_obj_1), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0474e541",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = data.join(new_col)\n",
    "data.fillna(value=0, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7e53ca5c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "44c28433",
   "metadata": {},
   "source": [
    "- 异常值: 如果所有延迟还款都为0, 但还是显示违约, 可以作为异常值处理\n",
    "- 还款延迟一个月也被认为'未违约'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "58ef439b",
   "metadata": {},
   "outputs": [],
   "source": [
    "error = (\n",
    "        (data['还款延迟一个月'] == 0 )\n",
    "        & (data['还款延迟二个月'] == 0 )\n",
    "        & (data['还款延迟三个月'] == 0 )\n",
    "        & (data['还款延迟四个月'] == 0 )\n",
    "        & (data['还款延迟五个月'] == 0 )\n",
    "        & (data['还款延迟六个月'] == 0 )\n",
    "        & (data['还款延迟七个月'] == 0 )\n",
    "        & (data['还款延迟八个月'] == 0 )\n",
    "        & (data['是否违约'] == 1)\n",
    "        )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "54732eb3",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = data[~error]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7c098fa6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8402a552",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "66c0a5fa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'按时还款',\n",
       " '提前还款',\n",
       " '还款延迟一个月',\n",
       " '还款延迟七个月',\n",
       " '还款延迟三个月',\n",
       " '还款延迟不到一个月',\n",
       " '还款延迟二个月',\n",
       " '还款延迟五个月',\n",
       " '还款延迟八个月',\n",
       " '还款延迟六个月',\n",
       " '还款延迟四个月'}"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 所有还款状态\n",
    "lst_repay_status = []\n",
    "for col in lst_col_obj_1[3:-1]:\n",
    "    lst_repay_status.extend(data[col].unique())\n",
    "set(lst_repay_status)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "f608da6f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 各月还款时间编码字典(按照时间从短期到长期排序编码, 方便找到最大延迟还款月数)\n",
    "dic_code_repay = {\n",
    "    '提前还款': -1, \n",
    "    '按时还款': 0, \n",
    "    '还款延迟不到一个月': 0.5, \n",
    "    '还款延迟一个月': 1, \n",
    "    '还款延迟二个月': 2, \n",
    "    '还款延迟三个月': 3, \n",
    "    '还款延迟四个月': 4, \n",
    "    '还款延迟五个月': 5, \n",
    "    '还款延迟六个月': 6, \n",
    "    '还款延迟七个月': 7, \n",
    "    '还款延迟八个月': 8\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "460336b2",
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in lst_col_obj_1[3:-1]:\n",
    "    data[col] = data[col].apply(lambda x: get_code(x, dic_code_repay))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "485bd73f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 查看是否还有非数值列:\n",
    "for col in data.columns:\n",
    "    if data[col].dtype == 'object':\n",
    "        print(col + ': 还是数值列')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50989865",
   "metadata": {},
   "source": [
    "### (3) 新增衍生特征\n",
    "#### 含义明确衍生特征"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "86772304",
   "metadata": {},
   "source": [
    "- 5-10月总账单金额\n",
    "- 5-10月总支付金额\n",
    "- 5-10月平均账单金额\n",
    "- 5-10月平均支付金额\n",
    "- 5-10月平均还款压力=1/6Σ(支付金额/信用额度)\n",
    "- 5-10月最大还款压力=max(支付金额1/信用额度...支付金额i/信用额度)\n",
    "- 5-10月最大还款延迟月数\n",
    "- 5-10月账单金额与支付金额比率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "4d8a9eaa",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_col_bill = ['10月的账单金额', '9月的账单金额', '8月的账单金额', '7月的账单金额', '6月的账单金额', '5月的账单金额', ]\n",
    "lst_col_pay = ['10月支付金额', '9月支付金额', '8月支付金额', '7月支付金额', '6月支付金额', '5月支付金额', ]\n",
    "lst_col_repay_status = ['10月还款', '9月还款', '8月还款', '7月还款', '6月还款', '5月还款', ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "3b0e1c8d",
   "metadata": {},
   "outputs": [],
   "source": [
    "data['5-10月总账单金额'] = data[lst_col_bill].sum(axis=1)\n",
    "data['5-10月总支付金额'] = data[lst_col_pay].sum(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "fbea85b5",
   "metadata": {},
   "outputs": [],
   "source": [
    "data['5-10月平均账单金额'] = data[lst_col_bill].mean(axis=1)\n",
    "data['5-10月平均支付金额'] = data[lst_col_pay].mean(axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "3a885d56",
   "metadata": {},
   "outputs": [],
   "source": [
    "data['5-10月平均还款压力'] = data.apply(lambda x: (x[lst_col_pay]/x['信用额度']).mean(), axis=1)\n",
    "data['5-10月最大还款压力'] = data.apply(lambda x: (x[lst_col_pay]/x['信用额度']).max(), axis=1)\n",
    "data['5-10月最大还款延迟月数'] = data.apply(lambda x: x[lst_col_repay_status].max(), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "be966243",
   "metadata": {},
   "outputs": [],
   "source": [
    "data['5-10月支付金额与账单金额比率'] = data['5-10月平均支付金额']/data['5-10月平均账单金额']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a80ec283",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "5e2feae9",
   "metadata": {},
   "source": [
    "- 检查是否有nan和inf\n",
    "- 处理nan和inf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "d60c7696",
   "metadata": {},
   "outputs": [],
   "source": [
    "data.fillna(value=0, inplace=True)\n",
    "data.replace([float('inf'), -float('inf')], 0, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "529d71ec",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "信用额度                0\n",
      "性别                  0\n",
      "教育                  0\n",
      "婚姻状况                0\n",
      "年龄                  0\n",
      "10月还款               0\n",
      "9月还款                0\n",
      "8月还款                0\n",
      "7月还款                0\n",
      "6月还款                0\n",
      "5月还款                0\n",
      "10月的账单金额            0\n",
      "9月的账单金额             0\n",
      "8月的账单金额             0\n",
      "7月的账单金额             0\n",
      "6月的账单金额             0\n",
      "5月的账单金额             0\n",
      "10月支付金额             0\n",
      "9月支付金额              0\n",
      "8月支付金额              0\n",
      "7月支付金额              0\n",
      "6月支付金额              0\n",
      "5月支付金额              0\n",
      "是否违约                0\n",
      "按时还款                0\n",
      "提前还款                0\n",
      "还款延迟一个月             0\n",
      "还款延迟七个月             0\n",
      "还款延迟三个月             0\n",
      "还款延迟不到一个月           0\n",
      "还款延迟二个月             0\n",
      "还款延迟五个月             0\n",
      "还款延迟八个月             0\n",
      "还款延迟六个月             0\n",
      "还款延迟四个月             0\n",
      "5-10月总账单金额          0\n",
      "5-10月总支付金额          0\n",
      "5-10月平均账单金额         0\n",
      "5-10月平均支付金额         0\n",
      "5-10月平均还款压力         0\n",
      "5-10月最大还款压力         0\n",
      "5-10月最大还款延迟月数       0\n",
      "5-10月支付金额与账单金额比率    0\n",
      "dtype: int64\n",
      "信用额度                0\n",
      "性别                  0\n",
      "教育                  0\n",
      "婚姻状况                0\n",
      "年龄                  0\n",
      "10月还款               0\n",
      "9月还款                0\n",
      "8月还款                0\n",
      "7月还款                0\n",
      "6月还款                0\n",
      "5月还款                0\n",
      "10月的账单金额            0\n",
      "9月的账单金额             0\n",
      "8月的账单金额             0\n",
      "7月的账单金额             0\n",
      "6月的账单金额             0\n",
      "5月的账单金额             0\n",
      "10月支付金额             0\n",
      "9月支付金额              0\n",
      "8月支付金额              0\n",
      "7月支付金额              0\n",
      "6月支付金额              0\n",
      "5月支付金额              0\n",
      "是否违约                0\n",
      "按时还款                0\n",
      "提前还款                0\n",
      "还款延迟一个月             0\n",
      "还款延迟七个月             0\n",
      "还款延迟三个月             0\n",
      "还款延迟不到一个月           0\n",
      "还款延迟二个月             0\n",
      "还款延迟五个月             0\n",
      "还款延迟八个月             0\n",
      "还款延迟六个月             0\n",
      "还款延迟四个月             0\n",
      "5-10月总账单金额          0\n",
      "5-10月总支付金额          0\n",
      "5-10月平均账单金额         0\n",
      "5-10月平均支付金额         0\n",
      "5-10月平均还款压力         0\n",
      "5-10月最大还款压力         0\n",
      "5-10月最大还款延迟月数       0\n",
      "5-10月支付金额与账单金额比率    0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(data.isna().sum())\n",
    "print(((data == float('inf')) | (data == -float('inf'))).sum())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdd81bdf",
   "metadata": {},
   "source": [
    "#### 交互特征"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcfed678",
   "metadata": {},
   "source": [
    "- 性别, 教育, 婚姻状况, 年龄分别与平均账单金额, 平均支付金额, 信用额度等新增的度量特征进行交互"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "a4eaee97",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_col_demographic = ['性别', '教育', '婚姻状况', '年龄']\n",
    "lst_col_financial = [\n",
    "    '信用额度', '5-10月总账单金额', '5-10月总支付金额', '5-10月平均账单金额', '5-10月平均支付金额',\n",
    "    '5-10月平均还款压力', '5-10月最大还款压力', '5-10月最大还款延迟月数', '5-10月支付金额与账单金额比率'\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "dba0b92a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# lst_col_demographic 需要+1, 因为有0编码\n",
    "for col_1 in lst_col_demographic:\n",
    "    for col_2 in lst_col_financial:\n",
    "        data[col_1 + '_' + col_2] = data.apply(lambda x: (x[col_1]+1)*x[col_2], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "27ea7bc4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f93b6673",
   "metadata": {},
   "source": [
    "#### 4分段, 10分段\n",
    "- 对lst_col_continuous中的特征进行分段\n",
    "- 对于有负数存在的列, 最好先做出直方图查看数据分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "e6b3d5fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>信用额度</th>\n",
       "      <th>年龄</th>\n",
       "      <th>10月的账单金额</th>\n",
       "      <th>9月的账单金额</th>\n",
       "      <th>8月的账单金额</th>\n",
       "      <th>7月的账单金额</th>\n",
       "      <th>6月的账单金额</th>\n",
       "      <th>5月的账单金额</th>\n",
       "      <th>10月支付金额</th>\n",
       "      <th>9月支付金额</th>\n",
       "      <th>8月支付金额</th>\n",
       "      <th>7月支付金额</th>\n",
       "      <th>6月支付金额</th>\n",
       "      <th>5月支付金额</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>2.766600e+04</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>2.766600e+04</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>167975.927131</td>\n",
       "      <td>35.433348</td>\n",
       "      <td>51292.892503</td>\n",
       "      <td>49352.885564</td>\n",
       "      <td>4.726482e+04</td>\n",
       "      <td>43671.727355</td>\n",
       "      <td>40808.508097</td>\n",
       "      <td>39365.431143</td>\n",
       "      <td>5757.208379</td>\n",
       "      <td>6.028917e+03</td>\n",
       "      <td>5305.507193</td>\n",
       "      <td>4873.401576</td>\n",
       "      <td>4831.229993</td>\n",
       "      <td>5243.470325</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>129916.931567</td>\n",
       "      <td>9.199623</td>\n",
       "      <td>72767.533913</td>\n",
       "      <td>70404.545865</td>\n",
       "      <td>6.875202e+04</td>\n",
       "      <td>63969.654833</td>\n",
       "      <td>60606.069231</td>\n",
       "      <td>59364.182082</td>\n",
       "      <td>16841.372922</td>\n",
       "      <td>2.354871e+04</td>\n",
       "      <td>17860.475971</td>\n",
       "      <td>15636.711342</td>\n",
       "      <td>15146.887926</td>\n",
       "      <td>17735.286761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>10000.000000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>-165580.000000</td>\n",
       "      <td>-69777.000000</td>\n",
       "      <td>-1.572640e+05</td>\n",
       "      <td>-170000.000000</td>\n",
       "      <td>-81334.000000</td>\n",
       "      <td>-209051.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>50000.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>3860.000000</td>\n",
       "      <td>3327.000000</td>\n",
       "      <td>3.002250e+03</td>\n",
       "      <td>2562.750000</td>\n",
       "      <td>2034.250000</td>\n",
       "      <td>1442.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>8.390000e+02</td>\n",
       "      <td>398.250000</td>\n",
       "      <td>300.000000</td>\n",
       "      <td>264.000000</td>\n",
       "      <td>150.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>140000.000000</td>\n",
       "      <td>34.000000</td>\n",
       "      <td>23083.000000</td>\n",
       "      <td>22061.000000</td>\n",
       "      <td>2.060850e+04</td>\n",
       "      <td>19443.000000</td>\n",
       "      <td>18541.500000</td>\n",
       "      <td>17676.500000</td>\n",
       "      <td>2150.000000</td>\n",
       "      <td>2.036500e+03</td>\n",
       "      <td>1878.000000</td>\n",
       "      <td>1514.500000</td>\n",
       "      <td>1544.000000</td>\n",
       "      <td>1500.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>240000.000000</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>67862.250000</td>\n",
       "      <td>64799.000000</td>\n",
       "      <td>6.106900e+04</td>\n",
       "      <td>55774.750000</td>\n",
       "      <td>50992.250000</td>\n",
       "      <td>49853.750000</td>\n",
       "      <td>5035.500000</td>\n",
       "      <td>5.000000e+03</td>\n",
       "      <td>4642.000000</td>\n",
       "      <td>4107.000000</td>\n",
       "      <td>4119.750000</td>\n",
       "      <td>4036.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1000000.000000</td>\n",
       "      <td>79.000000</td>\n",
       "      <td>964511.000000</td>\n",
       "      <td>983931.000000</td>\n",
       "      <td>1.664089e+06</td>\n",
       "      <td>891586.000000</td>\n",
       "      <td>927171.000000</td>\n",
       "      <td>961664.000000</td>\n",
       "      <td>873552.000000</td>\n",
       "      <td>1.684259e+06</td>\n",
       "      <td>896040.000000</td>\n",
       "      <td>621000.000000</td>\n",
       "      <td>426529.000000</td>\n",
       "      <td>528666.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 信用额度            年龄       10月的账单金额        9月的账单金额  \\\n",
       "count    27666.000000  27666.000000   27666.000000   27666.000000   \n",
       "mean    167975.927131     35.433348   51292.892503   49352.885564   \n",
       "std     129916.931567      9.199623   72767.533913   70404.545865   \n",
       "min      10000.000000     21.000000 -165580.000000  -69777.000000   \n",
       "25%      50000.000000     28.000000    3860.000000    3327.000000   \n",
       "50%     140000.000000     34.000000   23083.000000   22061.000000   \n",
       "75%     240000.000000     41.000000   67862.250000   64799.000000   \n",
       "max    1000000.000000     79.000000  964511.000000  983931.000000   \n",
       "\n",
       "            8月的账单金额        7月的账单金额        6月的账单金额        5月的账单金额  \\\n",
       "count  2.766600e+04   27666.000000   27666.000000   27666.000000   \n",
       "mean   4.726482e+04   43671.727355   40808.508097   39365.431143   \n",
       "std    6.875202e+04   63969.654833   60606.069231   59364.182082   \n",
       "min   -1.572640e+05 -170000.000000  -81334.000000 -209051.000000   \n",
       "25%    3.002250e+03    2562.750000    2034.250000    1442.000000   \n",
       "50%    2.060850e+04   19443.000000   18541.500000   17676.500000   \n",
       "75%    6.106900e+04   55774.750000   50992.250000   49853.750000   \n",
       "max    1.664089e+06  891586.000000  927171.000000  961664.000000   \n",
       "\n",
       "             10月支付金额        9月支付金额         8月支付金额         7月支付金额  \\\n",
       "count   27666.000000  2.766600e+04   27666.000000   27666.000000   \n",
       "mean     5757.208379  6.028917e+03    5305.507193    4873.401576   \n",
       "std     16841.372922  2.354871e+04   17860.475971   15636.711342   \n",
       "min         0.000000  0.000000e+00       0.000000       0.000000   \n",
       "25%      1000.000000  8.390000e+02     398.250000     300.000000   \n",
       "50%      2150.000000  2.036500e+03    1878.000000    1514.500000   \n",
       "75%      5035.500000  5.000000e+03    4642.000000    4107.000000   \n",
       "max    873552.000000  1.684259e+06  896040.000000  621000.000000   \n",
       "\n",
       "              6月支付金额         5月支付金额  \n",
       "count   27666.000000   27666.000000  \n",
       "mean     4831.229993    5243.470325  \n",
       "std     15146.887926   17735.286761  \n",
       "min         0.000000       0.000000  \n",
       "25%       264.000000     150.000000  \n",
       "50%      1544.000000    1500.000000  \n",
       "75%      4119.750000    4036.500000  \n",
       "max    426529.000000  528666.000000  "
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[lst_col_continuous].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6f08b968",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "1fc3e61c",
   "metadata": {},
   "source": [
    "- 存在负数的列, 即账单金额"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "040b08bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['10月的账单金额', '9月的账单金额', '8月的账单金额', '7月的账单金额', '6月的账单金额', '5月的账单金额']"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lst_col_bill"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "02bf2a6f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJcAAAK+CAYAAAAfev8sAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAACyu0lEQVR4nOzdeZQV1bmw8edlJkpAFEfUlhjUiKKIRlBUgmYRMMYhjknEaILXm+vwKQmSSc0kmjjG6TprNCpOGAXFaxIcAI1ocDYYIqMCLU5IIDawvz+quj3ddENzupuent9atXademuf3lV9Dr15a9euSCkhSZIkSZIkFaNNYzdAkiRJkiRJzZfJJUmSJEmSJBXN5JIkSZIkSZKKZnJJkiRJkiRJRTO5JEmSJEmSpKK1a+wG1KfNNtsslZSUNHYzJElSA3nhhRfeSyn1aOx2qDL7YJIktWzr6oO1qORSSUkJ06dPb+xmSJKkBhIRcxq7DVqTfTBJklq2dfXBvC1OkiRJkiRJRTO5JEmSJEmSpKKZXJIkSZIkSVLRTC5JkiRJkiSpaLWa0DsiTge+B+wILAR+l1K6No+dAYwCegB/AU5OKS3KY32B64A9gbnA2SmlR/JYJ+By4Nj8x9yex1fl8eOAXwLbAs8Dp6SUZtbxeCVJzcDHH3/M4sWLKSsra+ymqBFstNFG9OzZkzZtvAYmSVJTYf+s5atLH6y2T4u7EHgceAr4FnBNRMwCugFXAG8CLwPDgVuAYRHRBZgEdAXuBo4C7ouI3imlucClwKnAE2SJqTOABcDFETEAuBN4BxhPloB6ICJ2TymtXu+jlCQ1Gx9//DGLFi1im222oXPnzkREYzdJG9Dq1atZsGAB7733HptvvnljN0eSJGH/rDWoax+stumowSmlI1NKpwO/zrcNBc7K148EDgPeBr4WEVsBxwNbAFemlE4CLgE6AifkiadTgPnAMODw/H1OzsvT87aNTCkdBzwJ7Arss95HKElqVhYvXsw222zD5z73OTsurVCbNm3YYost+Oijjxq7KZIkKWf/rOWrax+sVsmllNLzBS+75eVyoD+wOKX0Rj6iaFoe2x0YkK9PzsspedkX6Ad0AKamlMpSSrPJRin1jojO66grSWrBysrK6Ny5c2M3Q42offv2rFy5srGbIUmScvbPWoe69MFqe1scABGxK9moIoCJwI+B0oJd3s/LTYGt8/XSWsTK41sDm+TlspTS8mrqaj2UnDuhsZtQlNljhzd2EyQ1Iq+ItW7+/lXIvowkNQ3+fW756vI7rvUsTRFxIPA02RxK1wJz8tCqanZfDbStIb62WGG8pljVdo2MiOkRMb20tLSaKpIkCSCltMF+VllZGY888ghPP/30BvuZkiRJTc2G7H8BzJ07lzvvvJPFixdv0J9bq+RSRHyFbELvTYCLgR8AH+Th7gW7lq8v5LPRRt1rEStfXwksyeMbR0T7aupWklK6PqXUP6XUv0ePHrU5HEmS6uT1119nv/32IyL45JNPKrZfeeWVbLfddnTu3Jnhw4ezaNGiitgzzzxDRKx1ufXWWyv2X7lyJQMHDuTiiy+u2FZaWsp+++3HH/7wh0rtOemkk9Z4r9mzZ1d6z0ceeYS9996bOXPmVNS7/fbb2XnnnXnrrbcqtn33u99l0KBBvPLKKzUe/xVXXEFE0K5dO2bOXPNBrnfccQfXXnstRx55JN///ve56qqr+M53vlPtMZ9//vnrPN+SJElrM3PmTL761a/y+c9/nl69enH33XdXxL73ve+tsw9WaPz48Rx88MFMnz69YtsNN9zAEUccwb/+9a9K+1Z9n5NOOonzzz+/4j1TSpxwwgmcffbZFXVWrlzJ8ccfz5FHHsnq1dn4mUWLFrHjjjsycuRIVq2qbpwN/Pvf/2b//fcnIjjggAPWiL/77rtcddVVnHfeeXz729/mhz/8IVdddRVf/OIXqz3m2bNnr99JXod13hYXER2BG8nmSDojpfT7PLQsIt4CvhgROwBzgYHAp8ALwAzgaGAQ8Oe8BJgKvJSvD4yItsD2ZLfCTUsplUXEDOAQYD+yeZcK60qSWpmGvi1mfW5fOfLIIxk/fvwaV6HGjRvHmWeeyc4778zuu+/OhAkT+O53v8vEiRMr7bf33nuzzz6Vn08xc+ZM/u///q/Sttdff51p06Zx3HHHVWy78847mTp1KiNHjlyjXV/96lc58cQTmT17Nj/96U8rxV588UWOP/54tt12WzbbbDPKysqYMmUK//73v5k5cybnnHMOZ599Ni+99BK33norO++8M6Wlpbz22mvsuuuuFe+zevVqzjvvPH7961+z11578dprr3HkkUdy7733sssuu1Tsd/755/Pxxx/Tq1cvAH7yk5+w8847c+211zJp0iTGjx/PpZdeSufOnenfv39tTrskSWpimkr/bNmyZRx88MEsXLiQE088kYkTJ/Ktb32LPn360KdPn4r9TjzxRLp06VKp7kMPPcT8+fMrbXvqqad48skn2WGHHSq2XXPNNbz11ltsscUWa/z8X/3qV5SUlHD77bevEfvpT3/K3Xffzc9//nMA5s2bx6xZs1ixYgUPP/wwV111Fbvvvjtjx45l1qxZDBs2jKeffprddtuNTTf9bFagBQsWcOSRR/L8888zcOBAnn76aX7wgx9wySWX0KlTJwBmzZrF6aefzo477shOO+3Ec889x+23317RPz3//PPZcsst+a//+i+ASu9fH2ozcukgYAfgE2CbiBibL0cDN+X7PAT8CSgBbkopLQXuBFYAoyLiFuBsYBFwV0ppAfAY0At4GBifv8/leVn+vrdExN1kyaVHU0prXh6VJGkD+utf/8pXv/pVNttss0rbL7/8cgAeeOAB/vSnP7HDDjvw6KOP8u6771bab9iwYVx11VWVlhNPPLHSPvfee29FJ+TMM88kIvjLX/7CddddB8Dpp59Ot27d6NatGy+//DIAX/ziF/nJT35C27ZtK73XK6+8wle/+lUA7rvvPjbaaCM++ugjBg8ezGmnnUZKiYcffpjBgwdz1llnAfDmm28yZMgQzjvvvIr3efHFFxk4cCC/+tWvOOKII3jmmWeYOHEi77zzDv369WPMmDEsWbIEgI4dO9KxY0f23ntvZsyYwWmnncZBBx3E/vvvzyabbEK7du045JBD2H///dltt92K/VVIkiTx8MMPM2/ePP7rv/6LG2+8kRtuuIHVq1dzzTXXVNrvggsuWKMPttNOO1Xa59xzz+Whhx5i5cqVbLbZZpSUlDBlyhRmzJjBihUr2GabbejWrRv7779/RZ2OHTsyevRovvjFL1Z6rwsvvJDf/OY3HHLIIRV9qnvuuYfBgwczfvx4Vq1axZlnnsngwYOZNGkSAL///e8ZPHgw06Zlz0pbtWoV1113HX369OGll17itttu45lnnuH//b//xzXXXEPfvn0ZN24cq1evpk2bNrRt25aOHTvy61//mhdeeIE99tiDIUOGsP/++1NWVsaOO+7I/vvvzyGHHLJGoq2uajOh95Z5uTEwumD7bcApwBbASWQJqJuBcwBSSnMi4ijgUuAE4GXg1DzxBDCCbETUwcBHwKiU0ri87j35aKgzgcPIkk/fL+oIJUmqRzNnzqRHjx6UlJTw3nvvAdnw5unTp7P55ptXjOAZMGAAb7/9Ni+//DJbbbVVRf2JEydW1Ct8z0ITJkzgoYceYvTo0bzyyitMnDiRe++9l3/84x8ccMABfPGLX+SVV17hb3/72zonXly5ciXLly/nwQcf5Etf+lKl2JgxY/jv//5vVq1aRUlJCUcffTSXXnppRfsBPv30U4499lgeeughUkr06dOHQw45pOJ2u1NPPZXf/e53jB07lssuu4wbbriBv/zlL+yyyy7ccccd3HHHHUDWWSpMJJWvv/LKK5WuKkqSJK2PuXPnArDddtsBVIy6fvXVVyvtd955562RUPnHP/5R6fVFF11Enz59GD16NH/84x+BbGRSmzZtOPHEE2nTpg33338/y5cvZ12WLFnCbrvtxr333kubNpXH9bz44ov06NGDu+66ix/96EeMGzeOAQMGMG3aNI455hgAnn32Wb797W8za9YsILu9b9myZfzv//4vvXv3ZsiQIfz5z3/m2GOPZdttt+XFF1/kmmuu4dRTT+Wb3/wmANtvvz1PPvkkhx12GAD3338/999/P3vttVel2/7qwzqTSyml28gSSTU5O1+qqzuR7Kly1cUWkyWOavq5Y4Gx62qfJEkbUnXz+5WWllJWVlYp1r17Nl1g+Wiecs8//zzPP/98rX7W2LFjufXWW5k4cSILFy5ku+2248EHH6R79+789re/5W9/+xvt27evtm55R2TLLbfkvvvuY7vttuPNN99k0003rUhIXXjhhVx44YUVde69917uvffeitdf/vKX6dChA5tvvjmDBw9mn332YezYsZx22mmVflb37t257rrruPrqq/n617/OiSeeSLdu3bjzzju56aabmDJlCnvssQeQzdc0c+ZMdtxxR/7f//t/tToPkiRJNfnCF74AZHMlnXLKKRVJoYULK0/ZXN1ta9XZa6+9GDt2LM8++yyvv/46KSW+853vcPPNNwMwbdq0GvtfH330UcVFxO985zsMHz6cd999l3fffbdiugCAfv36VapXnlAqtNNOO7Fy5UrGjBnD5MmTufHGG7nxxhsr7XPyySez+eabs2LFCpYvX87ZZ5/N0UcfzZlnnslhhx3G1772NQBKSkoYM2YMc+fO5Z///Cf//Oc/a3Uu1ketnxYnSZKqVz7xYtVb0oCKK1XlEzZecMEFpJQqLVUn6C43atQo7rnnHiDrPOy9994Vw6rLf2a7dpWvE5Unjg4++GAAfvzjHzNs2DB22WUXdtllFy655JKKfceMGcO8efMqJnQ8+uijmTdvHvPmzaNnz54V+1111VX8+c9/5je/+Q1lZWUVHZITTzyRsrIyFi9ezNFHH83kyZPp1q0bl19+Od/61rcYPnw4999/Pz/84Q/p1q0bAJ/73Oe4+uqr12i3JElSMQ477DD69u3LlClTKi54QdbngM/6YHPmzFmjDzZkyJA13m/69OmMGjWKWbNm8bnPfY7zzz+fZ555ptKtajX1v8aPH8/VV18NwB577MFXvvKVij5Y4WTgL774IvPmzat4cMu4ceOYN28e48aNq9hnk0024a233uI3v/kNzzzzDGVlZfzsZz8D4IknnqCsrIwbbriBCy+8kMsuu4xtt92WBx54gNLSUgYNGsSyZcsq9u/YsSMzZ87kvvvuW2Nqh/piz06SpDraZJNNAHj//fcrtpWvb7lldnf5ihUrgOy2uKqPhq3uiWtApURQ586dWbBgAffffz8HHXQQZWVlAJWunC1ZsoSNN94YgLfffpsddtiB66+/nnPOOYff//73jBgxAqDiilptRi6V/4w99tiDl156iUK33357pauA9957L0ceeST3338/f/zjH+nWrRu9e/fmRz/6EX/729+Azzp4VYeHS5IkFaN9+/Y888wz3HHHHXz66afsscceHHjggfTu3Rv4rA/285//vKKfVK7qbXEAr732Gq+99hqQ3VbWoUMH5s2bx7HHHsvLL79MWVlZjf2vESNGUFJSwgUXXMBdd93Fqaeeyvz58ytux3vkkUeA2o1cKm/Lnnvuucb28ouIABtttBGffPIJs2bN4v7772fatGnsueeezJ8/n379+lVMP1A+L1NDMbkkSVIdbbTRRnzxi1/krbfe4u2332a77bZj6tSpdOjQgb322gv4LKHz3HPP8dxzz9XqfVNK3HrrrXz3u9+lXbt23HHHHey2225MmDChYmRRu3btOOOMM3jttde4+uqrefXVVys9ea59+/YceuihnHfeeRxxxBF8/vOfp0uXLpVGS61evZoRI0YwaNCgSk+i23777SvWf/jDHzJu3Dh23XVX2rVrxy9/+Uv23ntvTjjhBO655x4OOOAA9thjD9q0acPkyZNZuHAhp5xyCt27d2fZsmXsvffe3HPPPXz44YcV50ySJKk+bLzxxhVPQSt/au6hhx4KfNYHu+22tc3285kRI0Zw6623ctBBBzF79mz69evH+eefzy9/+UueffZZysrKKkYuPfjggzz00EPMmzePfffdl379+lWMPho6dCgrV67k5z//OZdddhkAw4cPr7jwCDB58mRuuukmfvzjH1d68m55QmmbbbbhoosuYsKECRxxxBE89thjTJo0iR/84AdsueWW3H///Xz3u9+tqHf33Xezww47cOihh/Lxxx/z+OOPs8suuzB//nw+/PDDBu1/edlQkqR6cMoppwDwjW98g8MOO4zZs2dzyimnVFypmjFjBpB1Qmp7W1xVX/jCF5gxYwY333xzpZFLe+65J/fccw8777wz119/fcXPgmxU1DbbbMP8+fMZOnQo7777Ltdeey3vvfdepQWyK3uF21544QUmT54MZPMPTJgwgalTp1Y83e5LX/oS/fr1429/+xuvvPIKO+64I5Alov7973/zzDPPMG7cOF599dWKyTXLE2vl7ZckSaqrQYMGccYZZ/CNb3yDX//61+y+++4cf/zxrF69mldeeYWuXbuu0f+q6ba46vzwhz/k1VdfZejQoZVGLvXp04cHHniAkpISzjrrrEojgx577DEOPPBALr/8cn7xi1/w+uuvM2nSpEp9rU8++QT4bK6m8uXee+9l8eLF9OjRg48++oinnnqKjTbaiH333ReAb37zm8yePZsZM2ZUJKu+8IUvcMQRR/DOO+8wadIk7rjjDrbaais6duwIZH2wNm3a8Omnn9bbeS/kyCVJUpM3e+zwxm7COo0aNYpFixZx66238vbbb3PyySdX3Nb273//uyKBtPvuu69Rt/w2uapDlat7Elz5EO/58+cD2T30xx9/PI8//jh///vfue+++/jRj35UMSfThRdeyIgRI/jVr37FmDFjmDBhQo0TaVc32fgPfvADttpqKz755BOOPfZYSktLK5JXS5YsqXjayf/8z/8wffr0ivYBXHbZZcyZM4cRI0bQp08f/v73v3PIIYcAcMYZZ3D55ZdXJJ0kSVLz0tT6ZzfeeCMdOnTg+OOP59JLL6V9+/Y8+OCDLFy4kEGDBlVbZ/HixWv0t2677baKUU7lo7jbtWtHr169+OSTT/jwww/p3Lkzr7/+OsOGDWO33XZj0qRJfPnLX2bEiBEVT607/vjjmTBhAgsXLuSKK66gY8eOnHvuudW2o3yepkIDBw5k7ty5DB06lDvuuINFixbxzjvvAPDmm2/y/vvvc9BBB9GrVy9eeukl+vbtC2RPy7v55psZM2YMS5cu5be//S3du3fnJz/5CQDLli2r9eTm68PkkiRJRSifBLtc27ZtufTSS7n00kvX2PdHP/oRCxcuZJ999ql4Usjrr7/OkUceSYcOHSru9y+cRBtg9OjRvPLKK0ycmD149b777uOss86iffv2zJ49m0033ZSuXbvSvXt3HnjgAXbddVd22WUX9txzT7bbbjt+//vf89Of/pTvfve7dOzYkZ133pnDDz+c733ve5V+zsqVK2nfvn3FMPCqDjroIJ588smK1+W33T3yyCMVcwcMH551MB999FE6depUUa/cmWeeyZ/+9Cfat2/P//3f//E///M/nHXWWaxevdqnxkmSpDp5+umn19i2dOlSfvCDHwBZoqfcL3/5S+655x5WrFjBrFmz2HbbbSvV69OnD8OHD6946hxkI4VeeOEFPvroI1asWEFJSQmbb745O+20E3fccQcbbbQR9957LxHB9ddfz5AhQ/jFL37BwIED2W+//XjxxRcZPHgwo0ePrvSzbrzxRr7//e/z17/+tVK/CbK+5g477FDxunxybqDSk3v33ntvtthii4qn402bNq3iFrvevXvTr18/ZsyYwYEHHshpp53Gt771LQYMGMCcOXMq3aJXVyaXJElqYP/93//NX/7yF6666qqKbTvttBPvvvsuH3/8MW3atOHrX/86Bx54YKV6Y8eO5Y9//CNTpkyhXbt27LXXXixYsIAOHTrwxS9+kbFjxwJwzTXXVNRp06YNhx12GJBN6l044eThhx9eVPuvueYaPv7441rtu8suu/D3v/8dgHnz5vHPf/6TwYMHs9lmm7HJJptw1113MWTIEP7yl78waNAgvv71rxfVptYiIr4E3AAMBLqklD6JiD7AK1V2fSildHhepy9wHbAnMBc4O6X0SB7rBFwOHJvXuz2Pr8rjxwG/BLYFngdOSSlVP+O8JElNWJcuXfjxj3/MXXfdxfe///2K7TvvvHPFhN1dunThggsuqFRvr732YuzYsbz66qvMnTsXyEYDPfDAA3zuc5/jkEMOYdSoUWy22WZMmjSpol55Queiiy6q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g4AewKiU0ri87j35e3UCDgPGAyfWoZ2SJInsXvoNae7cudx5550sXrx4g/5cSZKkpqK19L9qPXIppVRS5fWVwJVr2b9iTqZqYovJEkc11R0LjK1t2yRJrVtD336yPreJzJo1i//5n//hySef5POf/zwnnXQSv/71r2nbti3f+973uOmmm9Zav7ADMn78eK666irGjh1L//79AbjhhhuYOHEil1xyCb169arYt+ow5hEjRlBSUsIFF1xASomUEieccAJbbbUVl156KQArV67kO9/5Dv/5z3+47777aNOmDYsWLWK//fbjK1/5Ctdeey1t27alqn//+9989atfZcqUKQwaNIinnnqqUvzdd9/l/vvv54UXXuDWW2/lxBNPZO+99+aKK67gn//85xrv9/bbb1NSUrL2EytJkpqUptL/Ov/887ngggvW2L799tsze/Zs+18bqP9Vl9viJElSgZQShx56KG+++SZHH300b775JhdddBFdu3ZlzJgxFfudeOKJdOnSpVLdhx56iPnz51fa9tRTT/Hkk09WemLHNddcw1tvvcUWW2yxxs//1a9+RUlJCbfffvsasZ/+9Kfcfffd/PznPwdg3rx5zJo1ixUrVvDwww9z1VVXsfvuuzN27FhmzZrFsGHDePrpp9ltt93YdNNNK95nwYIFHHnkkTz//PMMHDiQp59+mh/84AdccskldOrUCcgSbKeffjo77rgjO+20E8899xy33347Z555JjvvvDPnn38+W265Jf/1X/8FUOn9JUmS1sf+++/P6NGjK17PmTOHu+++m913373Sfva/Grb/ZXJJkqR6snjxYt58802+8IUvMG7cOP7+97/Tr18/nn766UrJpQsuuGCNK0Vvvvlmpc7Nueeey0MPPcTKlSvZbLPN2H777bnzzjuZMWMGbdu2ZZtttgGgT58+PPPMMwB07NiR0aNHc/jhh/PJJ59UvNeFF17Ib37zGw455BDOO+88AO655x5++MMfVuxz5plnVmrP73//e37/+9/z8MMPc+ihh7Jq1SpuuOEGxowZw/Lly7ntttv49re/zTnnnMNll13GE088wS9/+Uu++c1v0qZNG9q2bUvHjh254IILGDp0KPvvvz9Dhgxhhx12oKysjB133JH999+fzp07r9HRkyRJqq2DDz6Ygw8+uOL1d77zHQB+8pOfVNrP/lfD9r9MLkmSVE969OhBr169WLx4MbNmzeLZZ58F4JBDDqm033nnnbfGH/R//OMflV5fdNFF9OnTh9GjR/PHP/4RyK6MtWnThhNPPJE2bdpw//33s3z58nW2a8mSJey2227ce++9azzp5cUXX6RHjx7cdddd/OhHP2LcuHEMGDCAadOmccwxxwDw7LPP8u1vf5tZs2YB8L3vfY9ly5bxv//7v/Tu3ZshQ4bw5z//mWOPPZZtt92WF198kWuuuYZTTz2Vb37zm0A2NP3JJ5/ksMOyu+Lvv/9+7r//fvbaay+mT59eq/MrSZK0Nm+++SZ//OMfGTx4MF/+8pcrxex/NWz/y+SSJEn1pE2bNowfP57999+fHXfcEYCTTz6Zs846q9J+1Q2brs5ee+3F2LFjefbZZ3n99ddJKfGd73yHm2++GYBp06bRvn37aut+9NFHvPfee0B2BW/48OG8++67vPvuu5XmCujXr1+leuUdmkI77bQTK1euZMyYMUyePJkbb7yRG2+8sdI+J598MptvvjkrVqxg+fLlnH322Rx99NGceeaZHHbYYXzta18DoKSkhDFjxjB37lz++c9/VjsHgCRJUjEuv/xyVq9evcaIILD/1dD9r7o8LU6SJBVYvnw5I0eO5D//+Q/f//736devH7fddhv33nsvAKtXrwayuQDKJ3ksX4YMGbLG+02fPp1Ro0Yxa9YsPve5z3H++efzzDPPMG3aNABWrVpFu3aVrxOVTyw5fvx4rr76agD22GMPvvKVr7DLLruwyy678K9//ati/xdffJF58+Zx8cUXAzBu3DjmzZvHuHHjKvbZZJNNeOutt/jNb37DM888Q1lZGT/72c8AeOKJJygrK+OGG27gwgsv5LLLLmPbbbflgQceoLS0lEGDBrFs2bKK/Tt27MjMmTO577772Gyzzep+0iVJksgSO3fccQfdu3dn2LBhFdvtf22Y/pcjlyRJqifjxo3j2Wef5Uc/+hEXXXQRH330EZttthmjR4/mmGOOYcWKFQD8/Oc/Z+ONN65Ut+qwbIDXXnuN1157DciGNXfo0IF58+Zx7LHH8vLLL1NWVlbpytmSJUsq3rfwaSV33XUXp556KvPnz68YDv7II48AtbtyVt6WPffcc43thXMcbLTRRnzyySfMmjWL+++/n2nTprHnnnsyf/58+vXrR58+fYCsk1d1eLgkSVJdPPjggyxbtozjjz++Uv/I/teG6X+ZXJIkqZ589NFHABV/uMuvYpVvLx8mfdttt9Xq/UaMGMGtt97KQQcdxOzZs+nXrx/nn38+v/zlL3n22WcpKyuruHL24IMP8tBDDzFv3jz23Xdf+vXrV3H1a+jQoaxcuZKf//znXHbZZQAMHz6cLbfcsuJnTZ48mZtuuokf//jH7LLLLhXbyzs022yzDRdddBETJkzgiCOO4LHHHmPSpEn84Ac/YMstt+T+++/nu9/9bkW9u+++mx122IFDDz2Ujz/+mMcff5xddtmF+fPn8+GHH7LRRhut59mVJEmq2UMPPQRQMb9QOftfG6b/5WVDSZLqydChQ+ncuTOXX345p556KkOGDGHlypUcddRRrF69mldeeYWuXbuuMSS7pmHZ1fnhD3/Iq6++ytChQytdOevTpw8PPPAAJSUlnHXWWZWuTD322GMceOCBXH755fziF7/g9ddfZ9KkSbz33nsVS/nTTcrnCihf7r33XhYvXkyPHj346KOPeOqpp9hoo43Yd999AfjmN7/J7NmzmTFjRkVn6Qtf+AJHHHEE77zzDpMmTeKOO+5gq622omPHjgA899xztGnThk8//bTezr0kSWrdJk+eDED//v0rttn/2nD9L0cuSZKavdljhzd2EwDo3bs3jz76KD/+8Y+588476datG2effTa//OUveeihh1i4cCGDBg2qtu7ixYsrRjqVu+222yqusm2//fYAtGvXjl69evHJJ5/w4Ycf0rlzZ15//XWGDRvGbrvtxqRJk/jyl7/MiBEj2G677QA4/vjjmTBhAgsXLuSKK66gY8eOnHvuudW2o3yegEIDBw5k7ty5DB06lDvuuINFixbxzjvvANlTWd5//30OOuggevXqxUsvvUTfvn0B2HXXXbn55psZM2YMS5cu5be//S3du3eveDTwsmXLaj25piRJalqaSv8LYNasWXz44YdsscUWbLXVVhXb7X9tuP6XySVJkurRgQceyJQpUyptW7p0KT/4wQ+ArKNR7pe//CX33HMPK1asYNasWWy77baV6vXp04fhw4dXPAoXsitVL7zwAh999BErVqygpKSEzTffnJ122ok77riDjTbaiHvvvZeI4Prrr2fIkCH84he/YODAgey33368+OKLDB48mNGjR1f6WTfeeCPf//73+etf/8pBBx1UKTZ7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5ptz9tlnA7Bo0SK+8IUv8Pbbb3PdddfRq1cvZs+ezW677cYnPvEJfvazn9HQ0LBcHd966y3+5V/+hfvuu4/dd9+de+65Z5n4Sy+9xPXXX88jjzzCr371K4444gg++tGPct555/HXv/51ufM999xzDB06dOWNKkmSupSu1P8aN24cZ5111jLbbrjhBg488EAA+2BroA9mckmSpHZ0zz33MHr0aDbccEPGjBlDY2Mjb7/99jL7HHHEEfTr12+ZbTfddBMzZ85c7lx/+MMflnlix09/+lOeffZZNt100+W+9g9+8AOGDh3KFVdcsVzs29/+Ntdccw3f/e53AXj++eeZOnUqCxcu5Oabb+aCCy7gQx/6EOPHj2fq1KmMHj2ae++9lw9+8IMMHDhw6XleeOEFPvvZz/Lwww8zcuRI7r33Xo499ljOOuss1ltvPQCmTp3Kcccdx7vf/W7e+9738tBDD3HFFVdwwgkn8L73vY/TTjuNzTbbjP/1v/4XwDLnlyRJWl2vv/46DQ0NjBs3bum2YcOGLbeffbCO64OZXJIkqR19/etfB+Dee+9lhx12aHGf008/fblPiZ5++ullOjYnn3wyN910E4sWLWLQoEEMGTKEq666iilTptDQ0MCWW24JwA477MAf//hHAPr06cNJJ53EgQceyJtvvrn0XD/60Y/44Q9/yL777supp54KwLXXXss3v/nNpfuccMIJy9TnJz/5CT/5yU+4+eab2X///Vm8eDEXX3wxp5xyCgsWLODyyy/n8MMP58QTT+Scc87hzjvv5Pvf/z6f+9zn6NWrFw0NDfTp04fTTz+dUaNG8bGPfYy9996bbbfdlsbGRt797nfzsY99jL59+y7XyZMkSVodb7zxBuussw7jx6/8ofP2wTquD2ZySZKkdvK3v/2NRx99lP33358XX3yRG264Yenw5lqnnnrqcn/M//KXvyzz+owzzmCHHXbgpJNO4te//jVQfSrWq1cvjjjiCHr16sX111/PggULVlmvV155hQ9+8IP85je/We5JL48++iiDBw/m6quv5j/+4z+YMGECu+66Kw888ACHHHIIAA8++CCHH344U6dOBaqh5fPnz+cXv/gFw4YNY++99+b3v/89hx56KFtvvTWPPvooP/3pTznmmGP43Oc+B8CQIUP4wx/+wAEHHADA9ddfz/XXX89OO+3E5MmT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\n",
      "text/plain": [
       "<Figure size 1440x864 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 做图: 含有负数的特征的直方图\n",
    "plt.figure(figsize=(20, 12))\n",
    "\n",
    "plt.subplot(321)\n",
    "plt.hist(data['10月的账单金额'], label='10月的账单金额')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(322)\n",
    "plt.hist(data['9月的账单金额'], label='9月的账单金额')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(323)\n",
    "plt.hist(data['8月的账单金额'], label='8月的账单金额')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(324)\n",
    "plt.hist(data['7月的账单金额'], label='7月的账单金额')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(325)\n",
    "plt.hist(data['6月的账单金额'], label='6月的账单金额')\n",
    "plt.legend()\n",
    "\n",
    "plt.subplot(326)\n",
    "plt.hist(data['5月的账单金额'], label='5月的账单金额')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d3e92c99",
   "metadata": {},
   "source": [
    "- 发现每个图中的负数数据更加集中, 正数数据分布较广\n",
    "- 可以把负数进行4分段; 正数进行10分段处理;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "ded17a76",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 得到4分段和10分段的一张表结构, 方便接下来拼接\n",
    "df_bill_negative_des4 = pd.DataFrame(columns=data.describe().index)\n",
    "df_bill_positive_des10 = pd.DataFrame(columns=data.describe(percentiles=np.linspace(0.1, 0.9, 9, endpoint=True)).index)\n",
    "\n",
    "for col in lst_col_bill:\n",
    "    # 每个月账单金额的负数的4分位数*转置版\n",
    "    df_bill_negative_des4_temp = pd.DataFrame(data.loc[data[col] < 0, col].describe()).T\n",
    "    df_bill_negative_des4 = pd.concat((df_bill_negative_des4, df_bill_negative_des4_temp))\n",
    "    \n",
    "    # 每个月账单金额的负数的10分位数*转置版\n",
    "    df_bill_positive_des10_temp = pd.DataFrame(data.loc[data[col] >= 0, col].describe(percentiles=np.linspace(0.1, 0.9, 9, endpoint=True))).T\n",
    "    df_bill_positive_des10 = pd.concat((df_bill_positive_des10, df_bill_positive_des10_temp))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "b1be9e4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-8.37208333e+02, -1.53250000e+02, -1.55833333e+01, -1.00000000e+00,\n",
       "        1.42633333e+02,  1.68733333e+03,  6.02566667e+03,  1.31349000e+04,\n",
       "        2.11950000e+04,  3.26499000e+04,  4.84618667e+04,  7.58967000e+04,\n",
       "        1.28896450e+05])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat((df_bill_negative_des4.mean()[4:], df_bill_positive_des10.mean()[4:-1])).values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "5473c69b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 求des4和des10的平均值作为分段的标准(因为有多列含义相同的特征, 需要统一标准)\n",
    "# 并拼接他们中的所需要的分位点(负数中的最大值是需要的)\n",
    "lst_cut_bill = list(pd.concat((df_bill_negative_des4.mean()[4:], df_bill_positive_des10.mean()[4:-1])).values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "3b340d19",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_cut_bill(x, lst):\n",
    "    if x < lst[0]:\n",
    "        return 0\n",
    "    elif x < lst[1]:\n",
    "        return 1\n",
    "    elif x < lst[2]:\n",
    "        return 2\n",
    "    elif x < lst[3]:\n",
    "        return 3\n",
    "    elif x < lst[4]:\n",
    "        return 4\n",
    "    elif x < lst[5]:\n",
    "        return 5\n",
    "    elif x < lst[6]:\n",
    "        return 6\n",
    "    elif x < lst[7]:\n",
    "        return 7\n",
    "    elif x < lst[8]:\n",
    "        return 8\n",
    "    elif x < lst[9]:\n",
    "        return 9\n",
    "    elif x < lst[10]:\n",
    "        return 10\n",
    "    elif x < lst[11]:\n",
    "        return 11\n",
    "    elif x < lst[12]:\n",
    "        return 12\n",
    "    else:\n",
    "        return 13"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "ed701062",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对账单金额进行分段\n",
    "for col in lst_col_bill:\n",
    "    data[col] = data[col].apply(lambda x: get_cut_bill(x, lst_cut_bill))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f6e28c8",
   "metadata": {},
   "source": [
    "----------"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a673c83d",
   "metadata": {},
   "source": [
    "- 对支付金额进行分段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "0ac6a923",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['10月支付金额', '9月支付金额', '8月支付金额', '7月支付金额', '6月支付金额', '5月支付金额']"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lst_col_pay"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "badb212f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>10月支付金额</th>\n",
       "      <th>9月支付金额</th>\n",
       "      <th>8月支付金额</th>\n",
       "      <th>7月支付金额</th>\n",
       "      <th>6月支付金额</th>\n",
       "      <th>5月支付金额</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>27666.000000</td>\n",
       "      <td>2.766600e+04</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>5757.208379</td>\n",
       "      <td>6.028917e+03</td>\n",
       "      <td>5305.507193</td>\n",
       "      <td>4873.401576</td>\n",
       "      <td>4831.229993</td>\n",
       "      <td>5243.470325</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>16841.372922</td>\n",
       "      <td>2.354871e+04</td>\n",
       "      <td>17860.475971</td>\n",
       "      <td>15636.711342</td>\n",
       "      <td>15146.887926</td>\n",
       "      <td>17735.286761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1000.000000</td>\n",
       "      <td>8.390000e+02</td>\n",
       "      <td>398.250000</td>\n",
       "      <td>300.000000</td>\n",
       "      <td>264.000000</td>\n",
       "      <td>150.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2150.000000</td>\n",
       "      <td>2.036500e+03</td>\n",
       "      <td>1878.000000</td>\n",
       "      <td>1514.500000</td>\n",
       "      <td>1544.000000</td>\n",
       "      <td>1500.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>5035.500000</td>\n",
       "      <td>5.000000e+03</td>\n",
       "      <td>4642.000000</td>\n",
       "      <td>4107.000000</td>\n",
       "      <td>4119.750000</td>\n",
       "      <td>4036.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>873552.000000</td>\n",
       "      <td>1.684259e+06</td>\n",
       "      <td>896040.000000</td>\n",
       "      <td>621000.000000</td>\n",
       "      <td>426529.000000</td>\n",
       "      <td>528666.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             10月支付金额        9月支付金额         8月支付金额         7月支付金额  \\\n",
       "count   27666.000000  2.766600e+04   27666.000000   27666.000000   \n",
       "mean     5757.208379  6.028917e+03    5305.507193    4873.401576   \n",
       "std     16841.372922  2.354871e+04   17860.475971   15636.711342   \n",
       "min         0.000000  0.000000e+00       0.000000       0.000000   \n",
       "25%      1000.000000  8.390000e+02     398.250000     300.000000   \n",
       "50%      2150.000000  2.036500e+03    1878.000000    1514.500000   \n",
       "75%      5035.500000  5.000000e+03    4642.000000    4107.000000   \n",
       "max    873552.000000  1.684259e+06  896040.000000  621000.000000   \n",
       "\n",
       "              6月支付金额         5月支付金额  \n",
       "count   27666.000000   27666.000000  \n",
       "mean     4831.229993    5243.470325  \n",
       "std     15146.887926   17735.286761  \n",
       "min         0.000000       0.000000  \n",
       "25%       264.000000     150.000000  \n",
       "50%      1544.000000    1500.000000  \n",
       "75%      4119.750000    4036.500000  \n",
       "max    426529.000000  528666.000000  "
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 分别查看其4分位数和10分位数, 观察决定选用哪个\n",
    "data[lst_col_pay].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "9a2deb4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>10月支付金额</th>\n",
       "      <th>9月支付金额</th>\n",
       "      <th>8月支付金额</th>\n",
       "      <th>7月支付金额</th>\n",
       "      <th>6月支付金额</th>\n",
       "      <th>5月支付金额</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>27666.000000</td>\n",
       "      <td>2.766600e+04</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "      <td>27666.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>5757.208379</td>\n",
       "      <td>6.028917e+03</td>\n",
       "      <td>5305.507193</td>\n",
       "      <td>4873.401576</td>\n",
       "      <td>4831.229993</td>\n",
       "      <td>5243.470325</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>16841.372922</td>\n",
       "      <td>2.354871e+04</td>\n",
       "      <td>17860.475971</td>\n",
       "      <td>15636.711342</td>\n",
       "      <td>15146.887926</td>\n",
       "      <td>17735.286761</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10%</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20%</th>\n",
       "      <td>303.000000</td>\n",
       "      <td>2.080000e+02</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30%</th>\n",
       "      <td>1274.000000</td>\n",
       "      <td>1.176000e+03</td>\n",
       "      <td>800.000000</td>\n",
       "      <td>528.000000</td>\n",
       "      <td>501.000000</td>\n",
       "      <td>472.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40%</th>\n",
       "      <td>1750.000000</td>\n",
       "      <td>1.609000e+03</td>\n",
       "      <td>1246.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>2150.000000</td>\n",
       "      <td>2.036500e+03</td>\n",
       "      <td>1878.000000</td>\n",
       "      <td>1514.500000</td>\n",
       "      <td>1544.000000</td>\n",
       "      <td>1500.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60%</th>\n",
       "      <td>3006.000000</td>\n",
       "      <td>3.000000e+03</td>\n",
       "      <td>2500.000000</td>\n",
       "      <td>2200.000000</td>\n",
       "      <td>2200.000000</td>\n",
       "      <td>2167.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70%</th>\n",
       "      <td>4428.500000</td>\n",
       "      <td>4.120500e+03</td>\n",
       "      <td>3649.000000</td>\n",
       "      <td>3296.500000</td>\n",
       "      <td>3295.500000</td>\n",
       "      <td>3240.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80%</th>\n",
       "      <td>6300.000000</td>\n",
       "      <td>6.010000e+03</td>\n",
       "      <td>5397.000000</td>\n",
       "      <td>5000.000000</td>\n",
       "      <td>5000.000000</td>\n",
       "      <td>5000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90%</th>\n",
       "      <td>10426.500000</td>\n",
       "      <td>1.061000e+04</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>9752.000000</td>\n",
       "      <td>9642.000000</td>\n",
       "      <td>9777.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>873552.000000</td>\n",
       "      <td>1.684259e+06</td>\n",
       "      <td>896040.000000</td>\n",
       "      <td>621000.000000</td>\n",
       "      <td>426529.000000</td>\n",
       "      <td>528666.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             10月支付金额        9月支付金额         8月支付金额         7月支付金额  \\\n",
       "count   27666.000000  2.766600e+04   27666.000000   27666.000000   \n",
       "mean     5757.208379  6.028917e+03    5305.507193    4873.401576   \n",
       "std     16841.372922  2.354871e+04   17860.475971   15636.711342   \n",
       "min         0.000000  0.000000e+00       0.000000       0.000000   \n",
       "10%         0.000000  0.000000e+00       0.000000       0.000000   \n",
       "20%       303.000000  2.080000e+02       4.000000       0.000000   \n",
       "30%      1274.000000  1.176000e+03     800.000000     528.000000   \n",
       "40%      1750.000000  1.609000e+03    1246.000000    1000.000000   \n",
       "50%      2150.000000  2.036500e+03    1878.000000    1514.500000   \n",
       "60%      3006.000000  3.000000e+03    2500.000000    2200.000000   \n",
       "70%      4428.500000  4.120500e+03    3649.000000    3296.500000   \n",
       "80%      6300.000000  6.010000e+03    5397.000000    5000.000000   \n",
       "90%     10426.500000  1.061000e+04   10000.000000    9752.000000   \n",
       "max    873552.000000  1.684259e+06  896040.000000  621000.000000   \n",
       "\n",
       "              6月支付金额         5月支付金额  \n",
       "count   27666.000000   27666.000000  \n",
       "mean     4831.229993    5243.470325  \n",
       "std     15146.887926   17735.286761  \n",
       "min         0.000000       0.000000  \n",
       "10%         0.000000       0.000000  \n",
       "20%         0.000000       0.000000  \n",
       "30%       501.000000     472.000000  \n",
       "40%      1000.000000    1000.000000  \n",
       "50%      1544.000000    1500.000000  \n",
       "60%      2200.000000    2167.000000  \n",
       "70%      3295.500000    3240.000000  \n",
       "80%      5000.000000    5000.000000  \n",
       "90%      9642.000000    9777.000000  \n",
       "max    426529.000000  528666.000000  "
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 发现10分段中, 10%分位点处全为0, 保留意义不大, 可舍去10%分位点再进行求平均, 那么就是9分段\n",
    "data[lst_col_pay].describe(np.linspace(0.1, 0.9, 9, endpoint=True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "7b177957",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分别对4分位点和10分位点(9分段)求平均得到分段标准(记得转置)\n",
    "lst_cut_4_pay = list(data[lst_col_pay].describe()[4:-1].T.mean())\n",
    "lst_cut_9_pay = list(data[lst_col_pay].describe(percentiles=np.linspace(0.1, 0.9, 9, endpoint=True))[5:-1].T.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "7ad2596d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4分段函数(一类特征版)\n",
    "def get_cut_4_m(x, lst):\n",
    "    if x < lst[0]:\n",
    "        return 0\n",
    "    elif x < lst[1]:\n",
    "        return 1\n",
    "    elif x < lst[2]:\n",
    "        return 2\n",
    "    else:\n",
    "        return 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "540bdc3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 9分段函数(一类特征版)\n",
    "def get_cut_9(x, lst):\n",
    "    if x < lst[0]:\n",
    "        return 0\n",
    "    elif x < lst[1]:\n",
    "        return 1\n",
    "    elif x < lst[2]:\n",
    "        return 2\n",
    "    elif x < lst[3]:\n",
    "        return 3\n",
    "    elif x < lst[4]:\n",
    "        return 4\n",
    "    elif x < lst[5]:\n",
    "        return 5\n",
    "    elif x < lst[6]:\n",
    "        return 6\n",
    "    elif x < lst[7]:\n",
    "        return 7\n",
    "    else:\n",
    "        return 8"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "4d48861a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对支付金额分段\n",
    "for col in lst_col_pay:\n",
    "    # 4分段\n",
    "    data[str(col) + '_cut_4'] = data[col].apply(lambda x: get_cut_4_m(x, lst_cut_4_pay))\n",
    "    \n",
    "    # 9分段\n",
    "    data[str(col) + '_cut_9'] = data[col].apply(lambda x: get_cut_9(x, lst_cut_9_pay))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8759bada",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "7151306e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['信用额度',\n",
       " '年龄',\n",
       " '10月的账单金额',\n",
       " '9月的账单金额',\n",
       " '8月的账单金额',\n",
       " '7月的账单金额',\n",
       " '6月的账单金额',\n",
       " '5月的账单金额',\n",
       " '10月支付金额',\n",
       " '9月支付金额',\n",
       " '8月支付金额',\n",
       " '7月支付金额',\n",
       " '6月支付金额',\n",
       " '5月支付金额']"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lst_col_continuous"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "36ee3fce",
   "metadata": {},
   "source": [
    "- 对信用额度和年龄进行分段\n",
    "- 4分段和10分段都用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "f7ef27fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "des_4 = data[['信用额度', '年龄']].describe()[4:-1]\n",
    "des_10 = data[['信用额度', '年龄']].describe(percentiles=np.linspace(0.1, 0.9, 9, endpoint=True))[4:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "6b2997b0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4分段函数(多种特征版)\n",
    "def get_cut_4_o(x, cut0, cut1, cut2):\n",
    "    if x < cut0:\n",
    "        return 0\n",
    "    elif x < cut1:\n",
    "        return 1\n",
    "    elif x < cut2:\n",
    "        return 2\n",
    "    else:\n",
    "        return 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "5756d345",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 10分段函数\n",
    "def get_cut_10(x, cut0, cut1, cut2, cut3, cut4, cut5, cut6, cut7, cut8):\n",
    "    if x < cut0:\n",
    "        return 0\n",
    "    elif x < cut1:\n",
    "        return 1\n",
    "    elif x < cut2:\n",
    "        return 2\n",
    "    elif x < cut3:\n",
    "        return 3\n",
    "    elif x < cut4:\n",
    "        return 4\n",
    "    elif x < cut5:\n",
    "        return 5\n",
    "    elif x < cut6:\n",
    "        return 6\n",
    "    elif x < cut7:\n",
    "        return 7\n",
    "    elif x < cut8:\n",
    "        return 8\n",
    "    else:\n",
    "        return 9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "ba677929",
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in ['信用额度', '年龄']:\n",
    "    # 4分段\n",
    "    cut0, cut1, cut2 = des_4[col].values\n",
    "    data[str(col) + '_cut_4'] = data[col].apply(lambda x: get_cut_4_o(x, cut0, cut1, cut2))\n",
    "    \n",
    "    # 10分段\n",
    "    cut0, cut1, cut2, cut3, cut4, cut5, cut6, cut7, cut8 = des_10[col].values\n",
    "    data[str(col) + '_cut_10'] = data[col].apply(lambda x: get_cut_10(x, cut0, cut1, cut2, cut3, cut4, cut5, cut6, cut7, cut8))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f4f24520",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "19c2fc62",
   "metadata": {},
   "source": [
    "###### 检查数据\n",
    "- 是否有nan, inf\n",
    "- 是否全为数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "b82e7ad7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>信用额度</th>\n",
       "      <th>性别</th>\n",
       "      <th>教育</th>\n",
       "      <th>婚姻状况</th>\n",
       "      <th>年龄</th>\n",
       "      <th>10月还款</th>\n",
       "      <th>9月还款</th>\n",
       "      <th>8月还款</th>\n",
       "      <th>7月还款</th>\n",
       "      <th>6月还款</th>\n",
       "      <th>...</th>\n",
       "      <th>7月支付金额_cut_4</th>\n",
       "      <th>7月支付金额_cut_9</th>\n",
       "      <th>6月支付金额_cut_4</th>\n",
       "      <th>6月支付金额_cut_9</th>\n",
       "      <th>5月支付金额_cut_4</th>\n",
       "      <th>5月支付金额_cut_9</th>\n",
       "      <th>信用额度_cut_4</th>\n",
       "      <th>信用额度_cut_10</th>\n",
       "      <th>年龄_cut_4</th>\n",
       "      <th>年龄_cut_10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 95 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [信用额度, 性别, 教育, 婚姻状况, 年龄, 10月还款, 9月还款, 8月还款, 7月还款, 6月还款, 5月还款, 10月的账单金额, 9月的账单金额, 8月的账单金额, 7月的账单金额, 6月的账单金额, 5月的账单金额, 10月支付金额, 9月支付金额, 8月支付金额, 7月支付金额, 6月支付金额, 5月支付金额, 是否违约, 按时还款, 提前还款, 还款延迟一个月, 还款延迟七个月, 还款延迟三个月, 还款延迟不到一个月, 还款延迟二个月, 还款延迟五个月, 还款延迟八个月, 还款延迟六个月, 还款延迟四个月, 5-10月总账单金额, 5-10月总支付金额, 5-10月平均账单金额, 5-10月平均支付金额, 5-10月平均还款压力, 5-10月最大还款压力, 5-10月最大还款延迟月数, 5-10月支付金额与账单金额比率, 性别_信用额度, 性别_5-10月总账单金额, 性别_5-10月总支付金额, 性别_5-10月平均账单金额, 性别_5-10月平均支付金额, 性别_5-10月平均还款压力, 性别_5-10月最大还款压力, 性别_5-10月最大还款延迟月数, 性别_5-10月支付金额与账单金额比率, 教育_信用额度, 教育_5-10月总账单金额, 教育_5-10月总支付金额, 教育_5-10月平均账单金额, 教育_5-10月平均支付金额, 教育_5-10月平均还款压力, 教育_5-10月最大还款压力, 教育_5-10月最大还款延迟月数, 教育_5-10月支付金额与账单金额比率, 婚姻状况_信用额度, 婚姻状况_5-10月总账单金额, 婚姻状况_5-10月总支付金额, 婚姻状况_5-10月平均账单金额, 婚姻状况_5-10月平均支付金额, 婚姻状况_5-10月平均还款压力, 婚姻状况_5-10月最大还款压力, 婚姻状况_5-10月最大还款延迟月数, 婚姻状况_5-10月支付金额与账单金额比率, 年龄_信用额度, 年龄_5-10月总账单金额, 年龄_5-10月总支付金额, 年龄_5-10月平均账单金额, 年龄_5-10月平均支付金额, 年龄_5-10月平均还款压力, 年龄_5-10月最大还款压力, 年龄_5-10月最大还款延迟月数, 年龄_5-10月支付金额与账单金额比率, 10月支付金额_cut_4, 10月支付金额_cut_9, 9月支付金额_cut_4, 9月支付金额_cut_9, 8月支付金额_cut_4, 8月支付金额_cut_9, 7月支付金额_cut_4, 7月支付金额_cut_9, 6月支付金额_cut_4, 6月支付金额_cut_9, 5月支付金额_cut_4, 5月支付金额_cut_9, 信用额度_cut_4, 信用额度_cut_10, 年龄_cut_4, 年龄_cut_10]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 95 columns]"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[data.isna().any(axis=1)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "c929335b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>信用额度</th>\n",
       "      <th>性别</th>\n",
       "      <th>教育</th>\n",
       "      <th>婚姻状况</th>\n",
       "      <th>年龄</th>\n",
       "      <th>10月还款</th>\n",
       "      <th>9月还款</th>\n",
       "      <th>8月还款</th>\n",
       "      <th>7月还款</th>\n",
       "      <th>6月还款</th>\n",
       "      <th>...</th>\n",
       "      <th>7月支付金额_cut_4</th>\n",
       "      <th>7月支付金额_cut_9</th>\n",
       "      <th>6月支付金额_cut_4</th>\n",
       "      <th>6月支付金额_cut_9</th>\n",
       "      <th>5月支付金额_cut_4</th>\n",
       "      <th>5月支付金额_cut_9</th>\n",
       "      <th>信用额度_cut_4</th>\n",
       "      <th>信用额度_cut_10</th>\n",
       "      <th>年龄_cut_4</th>\n",
       "      <th>年龄_cut_10</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>0 rows × 95 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [信用额度, 性别, 教育, 婚姻状况, 年龄, 10月还款, 9月还款, 8月还款, 7月还款, 6月还款, 5月还款, 10月的账单金额, 9月的账单金额, 8月的账单金额, 7月的账单金额, 6月的账单金额, 5月的账单金额, 10月支付金额, 9月支付金额, 8月支付金额, 7月支付金额, 6月支付金额, 5月支付金额, 是否违约, 按时还款, 提前还款, 还款延迟一个月, 还款延迟七个月, 还款延迟三个月, 还款延迟不到一个月, 还款延迟二个月, 还款延迟五个月, 还款延迟八个月, 还款延迟六个月, 还款延迟四个月, 5-10月总账单金额, 5-10月总支付金额, 5-10月平均账单金额, 5-10月平均支付金额, 5-10月平均还款压力, 5-10月最大还款压力, 5-10月最大还款延迟月数, 5-10月支付金额与账单金额比率, 性别_信用额度, 性别_5-10月总账单金额, 性别_5-10月总支付金额, 性别_5-10月平均账单金额, 性别_5-10月平均支付金额, 性别_5-10月平均还款压力, 性别_5-10月最大还款压力, 性别_5-10月最大还款延迟月数, 性别_5-10月支付金额与账单金额比率, 教育_信用额度, 教育_5-10月总账单金额, 教育_5-10月总支付金额, 教育_5-10月平均账单金额, 教育_5-10月平均支付金额, 教育_5-10月平均还款压力, 教育_5-10月最大还款压力, 教育_5-10月最大还款延迟月数, 教育_5-10月支付金额与账单金额比率, 婚姻状况_信用额度, 婚姻状况_5-10月总账单金额, 婚姻状况_5-10月总支付金额, 婚姻状况_5-10月平均账单金额, 婚姻状况_5-10月平均支付金额, 婚姻状况_5-10月平均还款压力, 婚姻状况_5-10月最大还款压力, 婚姻状况_5-10月最大还款延迟月数, 婚姻状况_5-10月支付金额与账单金额比率, 年龄_信用额度, 年龄_5-10月总账单金额, 年龄_5-10月总支付金额, 年龄_5-10月平均账单金额, 年龄_5-10月平均支付金额, 年龄_5-10月平均还款压力, 年龄_5-10月最大还款压力, 年龄_5-10月最大还款延迟月数, 年龄_5-10月支付金额与账单金额比率, 10月支付金额_cut_4, 10月支付金额_cut_9, 9月支付金额_cut_4, 9月支付金额_cut_9, 8月支付金额_cut_4, 8月支付金额_cut_9, 7月支付金额_cut_4, 7月支付金额_cut_9, 6月支付金额_cut_4, 6月支付金额_cut_9, 5月支付金额_cut_4, 5月支付金额_cut_9, 信用额度_cut_4, 信用额度_cut_10, 年龄_cut_4, 年龄_cut_10]\n",
       "Index: []\n",
       "\n",
       "[0 rows x 95 columns]"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[(data == float('inf')).any(axis=1)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "b7471842",
   "metadata": {},
   "outputs": [],
   "source": [
    "for col in data.columns:\n",
    "    if data[col].dtype == 'object':\n",
    "        print(col)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b2f6245a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "b3857eac",
   "metadata": {},
   "source": [
    "# 3. 相关系数r&筛选特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "05be8600",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_corr = data.corr()\n",
    "y_corr = data_corr['是否违约'].abs().sort_values(ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "6f9a470d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "是否违约                  1.000000\n",
       "还款延迟二个月               0.556861\n",
       "5-10月最大还款延迟月数         0.526508\n",
       "教育_5-10月最大还款延迟月数      0.503978\n",
       "年龄_5-10月最大还款延迟月数      0.499653\n",
       "婚姻状况_5-10月最大还款延迟月数    0.493204\n",
       "10月还款                 0.489385\n",
       "性别_5-10月最大还款延迟月数      0.483044\n",
       "9月还款                  0.387150\n",
       "8月还款                  0.354420\n",
       "7月还款                  0.327133\n",
       "6月还款                  0.310751\n",
       "5月还款                  0.293002\n",
       "还款延迟三个月               0.249884\n",
       "还款延迟不到一个月             0.205818\n",
       "信用额度_cut_4            0.203305\n",
       "信用额度_cut_10           0.200661\n",
       "还款延迟一个月               0.196301\n",
       "信用额度                  0.181603\n",
       "10月支付金额_cut_9         0.181479\n",
       "10月支付金额_cut_4         0.176553\n",
       "9月支付金额_cut_9          0.167987\n",
       "教育_信用额度               0.167539\n",
       "9月支付金额_cut_4          0.163068\n",
       "年龄_信用额度               0.158250\n",
       "按时还款                  0.145842\n",
       "婚姻状况_信用额度             0.145731\n",
       "8月支付金额_cut_9          0.143017\n",
       "性别_信用额度               0.142503\n",
       "8月支付金额_cut_4          0.139313\n",
       "7月支付金额_cut_9          0.125610\n",
       "5月支付金额_cut_9          0.123092\n",
       "7月支付金额_cut_4          0.121044\n",
       "6月支付金额_cut_9          0.118185\n",
       "还款延迟四个月               0.117112\n",
       "5月支付金额_cut_4          0.115977\n",
       "6月支付金额_cut_4          0.112340\n",
       "5-10月总支付金额            0.110637\n",
       "5-10月平均支付金额           0.110637\n",
       "教育_5-10月平均支付金额        0.109333\n",
       "教育_5-10月总支付金额         0.109333\n",
       "年龄_5-10月平均支付金额        0.104370\n",
       "年龄_5-10月总支付金额         0.104370\n",
       "性别_5-10月总支付金额         0.102752\n",
       "性别_5-10月平均支付金额        0.102752\n",
       "婚姻状况_5-10月总支付金额       0.102675\n",
       "婚姻状况_5-10月平均支付金额      0.102675\n",
       "Name: 是否违约, dtype: float64"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 筛选r大于0.1的特征\n",
    "y_corr[y_corr > 0.1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "ba59707d",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_feats_tosplit_1 = [\n",
    "    '还款延迟二个月', '5-10月最大还款延迟月数', '教育_5-10月最大还款延迟月数', '年龄_5-10月最大还款延迟月数'\n",
    "    , '婚姻状况_5-10月最大还款延迟月数', '10月还款', '性别_5-10月最大还款延迟月数', '9月还款', '8月还款'\n",
    "    , '7月还款', '6月还款', '5月还款', '还款延迟三个月', '还款延迟不到一个月', '信用额度_cut_4'\n",
    "    , '还款延迟一个月', '10月支付金额_cut_9', '9月支付金额_cut_9', '教育_信用额度', '年龄_信用额度'\n",
    "    , '按时还款', '婚姻状况_信用额度', '8月支付金额_cut_9', '性别_信用额度', '7月支付金额_cut_9'\n",
    "    , '5月支付金额_cut_9', '6月支付金额_cut_9', '还款延迟四个月', '5-10月总支付金额', '5-10月平均支付金额'\n",
    "    , '教育_5-10月平均支付金额', '教育_5-10月总支付金额', '年龄_5-10月平均支付金额', '年龄_5-10月总支付金额'\n",
    "    , '性别_5-10月总支付金额', '性别_5-10月平均支付金额', '婚姻状况_5-10月总支付金额', '婚姻状况_5-10月平均支付金额'\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de704290",
   "metadata": {},
   "source": [
    "找出lst_feats_tosplit_1中互相高度相关的特征对, 并选择舍弃"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "b537df8b",
   "metadata": {},
   "outputs": [],
   "source": [
    "feats_corr = data[lst_feats_tosplit_1].corr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "0f44bcd3",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('教育_5-10月最大还款延迟月数', '5-10月最大还款延迟月数')\n",
      "('年龄_5-10月最大还款延迟月数', '5-10月最大还款延迟月数')\n",
      "('年龄_5-10月最大还款延迟月数', '教育_5-10月最大还款延迟月数')\n",
      "('婚姻状况_5-10月最大还款延迟月数', '5-10月最大还款延迟月数')\n",
      "('婚姻状况_5-10月最大还款延迟月数', '教育_5-10月最大还款延迟月数')\n",
      "('婚姻状况_5-10月最大还款延迟月数', '年龄_5-10月最大还款延迟月数')\n",
      "('性别_5-10月最大还款延迟月数', '5-10月最大还款延迟月数')\n",
      "('性别_5-10月最大还款延迟月数', '教育_5-10月最大还款延迟月数')\n",
      "('性别_5-10月最大还款延迟月数', '年龄_5-10月最大还款延迟月数')\n",
      "('性别_5-10月最大还款延迟月数', '婚姻状况_5-10月最大还款延迟月数')\n",
      "('6月还款', '7月还款')\n",
      "('5月还款', '6月还款')\n",
      "('教育_信用额度', '信用额度_cut_4')\n",
      "('年龄_信用额度', '信用额度_cut_4')\n",
      "('年龄_信用额度', '教育_信用额度')\n",
      "('婚姻状况_信用额度', '教育_信用额度')\n",
      "('婚姻状况_信用额度', '年龄_信用额度')\n",
      "('性别_信用额度', '教育_信用额度')\n",
      "('性别_信用额度', '年龄_信用额度')\n",
      "('5-10月平均支付金额', '5-10月总支付金额')\n",
      "('教育_5-10月平均支付金额', '5-10月总支付金额')\n",
      "('教育_5-10月平均支付金额', '5-10月平均支付金额')\n",
      "('教育_5-10月总支付金额', '5-10月总支付金额')\n",
      "('教育_5-10月总支付金额', '5-10月平均支付金额')\n",
      "('教育_5-10月总支付金额', '教育_5-10月平均支付金额')\n",
      "('年龄_5-10月平均支付金额', '5-10月总支付金额')\n",
      "('年龄_5-10月平均支付金额', '5-10月平均支付金额')\n",
      "('年龄_5-10月平均支付金额', '教育_5-10月平均支付金额')\n",
      "('年龄_5-10月平均支付金额', '教育_5-10月总支付金额')\n",
      "('年龄_5-10月总支付金额', '5-10月总支付金额')\n",
      "('年龄_5-10月总支付金额', '5-10月平均支付金额')\n",
      "('年龄_5-10月总支付金额', '教育_5-10月平均支付金额')\n",
      "('年龄_5-10月总支付金额', '教育_5-10月总支付金额')\n",
      "('年龄_5-10月总支付金额', '年龄_5-10月平均支付金额')\n",
      "('性别_5-10月总支付金额', '5-10月总支付金额')\n",
      "('性别_5-10月总支付金额', '5-10月平均支付金额')\n",
      "('性别_5-10月总支付金额', '教育_5-10月平均支付金额')\n",
      "('性别_5-10月总支付金额', '教育_5-10月总支付金额')\n",
      "('性别_5-10月总支付金额', '年龄_5-10月平均支付金额')\n",
      "('性别_5-10月总支付金额', '年龄_5-10月总支付金额')\n",
      "('性别_5-10月平均支付金额', '5-10月总支付金额')\n",
      "('性别_5-10月平均支付金额', '5-10月平均支付金额')\n",
      "('性别_5-10月平均支付金额', '教育_5-10月平均支付金额')\n",
      "('性别_5-10月平均支付金额', '教育_5-10月总支付金额')\n",
      "('性别_5-10月平均支付金额', '年龄_5-10月平均支付金额')\n",
      "('性别_5-10月平均支付金额', '年龄_5-10月总支付金额')\n",
      "('性别_5-10月平均支付金额', '性别_5-10月总支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '5-10月总支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '5-10月平均支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '教育_5-10月平均支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '教育_5-10月总支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '年龄_5-10月平均支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '年龄_5-10月总支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '性别_5-10月总支付金额')\n",
      "('婚姻状况_5-10月总支付金额', '性别_5-10月平均支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '5-10月总支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '5-10月平均支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '教育_5-10月平均支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '教育_5-10月总支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '年龄_5-10月平均支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '年龄_5-10月总支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '性别_5-10月总支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '性别_5-10月平均支付金额')\n",
      "('婚姻状况_5-10月平均支付金额', '婚姻状况_5-10月总支付金额')\n"
     ]
    }
   ],
   "source": [
    "highly_corr_pairs = []\n",
    "shrehold = 0.8   # 阈值\n",
    "for i in range(len(feats_corr.columns)):\n",
    "    for j in range(i):\n",
    "        if (abs(feats_corr.iloc[i,j]) > shrehold):\n",
    "            highly_corr_pairs.append((feats_corr.columns[i], feats_corr.columns[j]))\n",
    "\n",
    "for pair in highly_corr_pairs:\n",
    "    print(pair)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "17d39a31",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 最终保留特征\n",
    "lst_feats_target = [\n",
    "    '5-10月最大还款延迟月数', '7月还款', '5月还款', '信用额度_cut_4', '婚姻状况_信用额度',\n",
    "    '性别_信用额度', '5-10月平均支付金额', '是否违约'\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1170caf",
   "metadata": {},
   "source": [
    "# 4. 测试集&训练集划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "1a99c8d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    23364\n",
       "1     4302\n",
       "Name: 是否违约, dtype: int64"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看target分布情况\n",
    "data['是否违约'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b512818",
   "metadata": {},
   "source": [
    "- 分布明显不均衡, 需要正负均衡划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "4d8da81c",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_to_split = data[lst_feats_target]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "2cb834a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_flt_0 = data_to_split[data_to_split['是否违约'] == 0]\n",
    "data_flt_1 = data_to_split[data_to_split['是否违约'] == 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "af13ea56",
   "metadata": {},
   "outputs": [],
   "source": [
    "x0 = data_flt_0.iloc[:, :-1]\n",
    "y0 = data_flt_0['是否违约']\n",
    "x1 = data_flt_1.iloc[:, :-1]\n",
    "y1 = data_flt_1['是否违约']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "bd767b47",
   "metadata": {},
   "outputs": [],
   "source": [
    "x0_train, x0_test, y0_train, y0_test = train_test_split(x0, y0, train_size=0.8)\n",
    "x1_train, x1_test, y1_train, y1_test = train_test_split(x1, y1, train_size=0.8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "f32b5971",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = pd.concat((x0_train, x1_train))\n",
    "x_test = pd.concat((x0_test, x1_test))\n",
    "y_train = pd.concat((y0_train, y1_train))\n",
    "y_test = pd.concat((y0_test, y1_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b7e9243",
   "metadata": {},
   "source": [
    "# 5. 模型计算&调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "c036c9fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建字典, 保存每个模型的最优准确度\n",
    "dic_score = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e91f6b4",
   "metadata": {},
   "source": [
    "#### KNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "abe755d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_knn = []\n",
    "for n in range(10, 26):\n",
    "    for w in ['uniform', 'distance']:\n",
    "        model_knn = KNeighborsClassifier(n_neighbors=n, weights=w).fit(x_train, y_train)\n",
    "        dic_knn = {'n_neighbors': n, 'weights': w, 'score': model_knn.score(x_test, y_test)}\n",
    "        lst_knn.append(dic_knn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "38d0d54c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>n_neighbors</th>\n",
       "      <th>weights</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>22</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.843694</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>18</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.843151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>20</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.842790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>16</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.842609</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>24</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.842429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>25</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.841525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>19</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.841525</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>23</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.841344</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>21</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.840983</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.840802</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>12</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.840441</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>17</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.840260</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>14</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.839357</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>15</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.838995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>13</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.838453</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11</td>\n",
       "      <td>uniform</td>\n",
       "      <td>0.837911</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>25</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.823997</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>24</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.823636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>23</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.823094</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>21</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.822551</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>22</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.822551</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>19</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.821648</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>20</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.821106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>18</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.820564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>17</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.817673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>16</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.816950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>14</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.816227</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>15</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.815323</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>13</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.814239</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>12</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.813516</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.810987</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10</td>\n",
       "      <td>distance</td>\n",
       "      <td>0.810625</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    n_neighbors   weights     score\n",
       "24           22   uniform  0.843694\n",
       "16           18   uniform  0.843151\n",
       "20           20   uniform  0.842790\n",
       "12           16   uniform  0.842609\n",
       "28           24   uniform  0.842429\n",
       "30           25   uniform  0.841525\n",
       "18           19   uniform  0.841525\n",
       "26           23   uniform  0.841344\n",
       "22           21   uniform  0.840983\n",
       "0            10   uniform  0.840802\n",
       "4            12   uniform  0.840441\n",
       "14           17   uniform  0.840260\n",
       "8            14   uniform  0.839357\n",
       "10           15   uniform  0.838995\n",
       "6            13   uniform  0.838453\n",
       "2            11   uniform  0.837911\n",
       "31           25  distance  0.823997\n",
       "29           24  distance  0.823636\n",
       "27           23  distance  0.823094\n",
       "23           21  distance  0.822551\n",
       "25           22  distance  0.822551\n",
       "19           19  distance  0.821648\n",
       "21           20  distance  0.821106\n",
       "17           18  distance  0.820564\n",
       "15           17  distance  0.817673\n",
       "13           16  distance  0.816950\n",
       "9            14  distance  0.816227\n",
       "11           15  distance  0.815323\n",
       "7            13  distance  0.814239\n",
       "5            12  distance  0.813516\n",
       "3            11  distance  0.810987\n",
       "1            10  distance  0.810625"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(lst_knn).sort_values('score', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "db055d95",
   "metadata": {},
   "outputs": [],
   "source": [
    "score_knn = KNeighborsClassifier(n_neighbors=22, weights='uniform').fit(x_train, y_train).score(x_test, y_test)\n",
    "dic_score['score_knn'] = score_knn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f9c7082a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "968ddd5b",
   "metadata": {},
   "source": [
    "#### 逻辑回归(LR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "9972ecb8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n",
      "参数搭配不当: \n",
      "{'solver', 'penalty'}\n"
     ]
    }
   ],
   "source": [
    "lst_lr = []\n",
    "for p in ['l1', 'l2', 'elasticnet']:\n",
    "    for inter in [True, False]:\n",
    "        for sol in ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']:\n",
    "            for multi in ['auto', 'ovr', 'multinomial']:\n",
    "                try:\n",
    "                    model_lr = LogisticRegression(penalty=p, fit_intercept=inter, solver=sol, multi_class=multi).fit(x_train, y_train)\n",
    "                    dic_lr = {\n",
    "                        'penalty': p, \n",
    "                        'fit_intercept': inter, \n",
    "                        'solver': sol, \n",
    "                        'multi_class': multi, \n",
    "                        'score': model_lr.score(x_test, y_test)\n",
    "                    }\n",
    "                    lst_lr.append(dic_lr)\n",
    "                except ValueError:\n",
    "                    print('参数搭配不当: ')\n",
    "                    print(set({'penalty': p, 'solver': sol}))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "eb22bfca",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>penalty</th>\n",
       "      <th>fit_intercept</th>\n",
       "      <th>solver</th>\n",
       "      <th>multi_class</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>l1</td>\n",
       "      <td>True</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.858511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>newton-cg</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.858511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>newton-cg</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.858511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>newton-cg</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.858511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>l1</td>\n",
       "      <td>True</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.858511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>lbfgs</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.852006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>lbfgs</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.849476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>sag</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>sag</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>sag</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>sag</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>35</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>saga</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>saga</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>lbfgs</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>lbfgs</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>saga</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>saga</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>saga</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>sag</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>sag</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>l1</td>\n",
       "      <td>True</td>\n",
       "      <td>saga</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>l1</td>\n",
       "      <td>True</td>\n",
       "      <td>saga</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>l1</td>\n",
       "      <td>True</td>\n",
       "      <td>saga</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>l1</td>\n",
       "      <td>False</td>\n",
       "      <td>saga</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>l1</td>\n",
       "      <td>False</td>\n",
       "      <td>saga</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>l1</td>\n",
       "      <td>False</td>\n",
       "      <td>saga</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>lbfgs</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>lbfgs</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>l2</td>\n",
       "      <td>True</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>saga</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.844416</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>newton-cg</td>\n",
       "      <td>multinomial</td>\n",
       "      <td>0.811890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>newton-cg</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.811529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>l2</td>\n",
       "      <td>False</td>\n",
       "      <td>newton-cg</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.811529</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>l1</td>\n",
       "      <td>False</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>ovr</td>\n",
       "      <td>0.811348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>l1</td>\n",
       "      <td>False</td>\n",
       "      <td>liblinear</td>\n",
       "      <td>auto</td>\n",
       "      <td>0.811348</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   penalty  fit_intercept     solver  multi_class     score\n",
       "0       l1           True  liblinear         auto  0.858511\n",
       "11      l2           True  newton-cg          ovr  0.858511\n",
       "12      l2           True  newton-cg  multinomial  0.858511\n",
       "10      l2           True  newton-cg         auto  0.858511\n",
       "1       l1           True  liblinear          ovr  0.858511\n",
       "15      l2           True      lbfgs  multinomial  0.852006\n",
       "29      l2          False      lbfgs  multinomial  0.849476\n",
       "34      l2          False        sag  multinomial  0.844416\n",
       "33      l2          False        sag          ovr  0.844416\n",
       "32      l2          False        sag         auto  0.844416\n",
       "31      l2          False  liblinear          ovr  0.844416\n",
       "30      l2          False  liblinear         auto  0.844416\n",
       "20      l2           True        sag  multinomial  0.844416\n",
       "35      l2          False       saga         auto  0.844416\n",
       "36      l2          False       saga          ovr  0.844416\n",
       "28      l2          False      lbfgs          ovr  0.844416\n",
       "27      l2          False      lbfgs         auto  0.844416\n",
       "23      l2           True       saga  multinomial  0.844416\n",
       "22      l2           True       saga          ovr  0.844416\n",
       "21      l2           True       saga         auto  0.844416\n",
       "19      l2           True        sag          ovr  0.844416\n",
       "18      l2           True        sag         auto  0.844416\n",
       "17      l2           True  liblinear          ovr  0.844416\n",
       "2       l1           True       saga         auto  0.844416\n",
       "3       l1           True       saga          ovr  0.844416\n",
       "4       l1           True       saga  multinomial  0.844416\n",
       "7       l1          False       saga         auto  0.844416\n",
       "8       l1          False       saga          ovr  0.844416\n",
       "9       l1          False       saga  multinomial  0.844416\n",
       "13      l2           True      lbfgs         auto  0.844416\n",
       "14      l2           True      lbfgs          ovr  0.844416\n",
       "16      l2           True  liblinear         auto  0.844416\n",
       "37      l2          False       saga  multinomial  0.844416\n",
       "26      l2          False  newton-cg  multinomial  0.811890\n",
       "25      l2          False  newton-cg          ovr  0.811529\n",
       "24      l2          False  newton-cg         auto  0.811529\n",
       "6       l1          False  liblinear          ovr  0.811348\n",
       "5       l1          False  liblinear         auto  0.811348"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(lst_lr).sort_values('score', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "49893045",
   "metadata": {},
   "outputs": [],
   "source": [
    "score_lr = LogisticRegression(penalty='l2',\n",
    "                              fit_intercept=True,\n",
    "                              solver='newton-cg',\n",
    "                              multi_class='multinomial').fit(x_train, y_train).score(x_test, y_test)\n",
    "\n",
    "dic_score['score_lr'] = score_lr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7172b92b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "617c8b91",
   "metadata": {},
   "source": [
    "#### 朴素贝叶斯"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "9c12a8fa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8435128297795447"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 高斯朴素\n",
    "gs_nb = GaussianNB().fit(x_train, y_train)\n",
    "gs_nb.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "b9cc18c8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集中存在负数\n"
     ]
    }
   ],
   "source": [
    "# 多项式朴素\n",
    "# 训练集和测试集中包含负数, 该算法不适用\n",
    "try:\n",
    "    multi_nb = MultinomialNB().fit(x_train, y_train)\n",
    "    multi_nb.score(x_test, y_test)\n",
    "except ValueError:\n",
    "    print('测试集中存在负数')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "34bf7557",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.845500542103361"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 伯努利朴素\n",
    "bn_nb = BernoulliNB().fit(x_train, y_train)\n",
    "bn_nb.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "700f641b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "246a84bc",
   "metadata": {},
   "source": [
    "#### 决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "f627225d",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_dt = []\n",
    "for cri in [\"gini\", \"entropy\"]:\n",
    "    for depth in range(5, 10):\n",
    "        for samples_split in range(10, 25):\n",
    "            for samples_leaf in range(5, 15):\n",
    "                model_dt = DecisionTreeClassifier(criterion=cri,\n",
    "                                                  max_depth=depth, \n",
    "                                                  min_samples_split=samples_split, \n",
    "                                                  min_samples_leaf=samples_leaf).fit(x_train, y_train)\n",
    "                dic_dt = {\n",
    "                    'criterion': cri, \n",
    "                    'max_depth': depth, \n",
    "                    'min_samples_split': samples_split, \n",
    "                    'min_samples_leaf': samples_leaf, \n",
    "                    'score': model_dt.score(x_test, y_test)\n",
    "                }\n",
    "                lst_dt.append(dic_dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "84201e0d",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>criterion</th>\n",
       "      <th>max_depth</th>\n",
       "      <th>min_samples_split</th>\n",
       "      <th>min_samples_leaf</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>450</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>5</td>\n",
       "      <td>0.868269</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>460</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>11</td>\n",
       "      <td>5</td>\n",
       "      <td>0.868088</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>593</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>8</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>461</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>11</td>\n",
       "      <td>6</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>594</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>9</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>471</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>6</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>591</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>6</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>451</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>6</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>481</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>592</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>7</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>478</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>13</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>477</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>12</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>508</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>15</td>\n",
       "      <td>13</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>599</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>14</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>598</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>13</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>597</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>24</td>\n",
       "      <td>12</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>509</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>15</td>\n",
       "      <td>14</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>548</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>19</td>\n",
       "      <td>13</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>549</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>19</td>\n",
       "      <td>14</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>470</th>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>5</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    criterion  max_depth  min_samples_split  min_samples_leaf     score\n",
       "450      gini          8                 10                 5  0.868269\n",
       "460      gini          8                 11                 5  0.868088\n",
       "593      gini          8                 24                 8  0.867907\n",
       "461      gini          8                 11                 6  0.867907\n",
       "594      gini          8                 24                 9  0.867907\n",
       "471      gini          8                 12                 6  0.867907\n",
       "591      gini          8                 24                 6  0.867907\n",
       "451      gini          8                 10                 6  0.867907\n",
       "481      gini          8                 13                 6  0.867907\n",
       "592      gini          8                 24                 7  0.867907\n",
       "478      gini          8                 12                13  0.867727\n",
       "477      gini          8                 12                12  0.867727\n",
       "508      gini          8                 15                13  0.867727\n",
       "599      gini          8                 24                14  0.867727\n",
       "598      gini          8                 24                13  0.867727\n",
       "597      gini          8                 24                12  0.867727\n",
       "509      gini          8                 15                14  0.867727\n",
       "548      gini          8                 19                13  0.867727\n",
       "549      gini          8                 19                14  0.867727\n",
       "470      gini          8                 12                 5  0.867727"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(lst_dt).sort_values('score', ascending=False).head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "0246b9e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "score_dt = DecisionTreeClassifier(criterion='gini',\n",
    "                                  max_depth=8,\n",
    "                                  min_samples_split=10,\n",
    "                                  min_samples_leaf=5).fit(x_train, y_train).score(x_test, y_test)\n",
    "dic_score['score_dt'] = score_dt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3c013442",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "108fffc1",
   "metadata": {},
   "source": [
    "#### 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "9089b983",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_rf = []\n",
    "for oob in [True, False]:\n",
    "    for cri in ['gini', 'entropy']:\n",
    "        for depth in range(5, 10):\n",
    "            for samples_split in range(10, 25):\n",
    "                for samples_leaf in range(5, 15):\n",
    "                    model_rf = RandomForestClassifier(\n",
    "                                    oob_score=oob, \n",
    "                                    criterion=cri, \n",
    "                                    max_depth=depth, \n",
    "                                    min_samples_split=samples_split, \n",
    "                                    min_samples_leaf=samples_leaf\n",
    "                                ).fit(x_train, y_train)\n",
    "                    dic_rf = {\n",
    "                        'oob_score': oob, \n",
    "                        'criterion': cri, \n",
    "                        'max_depth': depth, \n",
    "                        'min_samples_split': samples_split, \n",
    "                        'min_samples_leaf': samples_leaf,\n",
    "                        'score': model_rf.score(x_test, y_test)\n",
    "                    }\n",
    "                    lst_rf.append(dic_rf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "42dc09a2",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>oob_score</th>\n",
       "      <th>criterion</th>\n",
       "      <th>max_depth</th>\n",
       "      <th>min_samples_split</th>\n",
       "      <th>min_samples_leaf</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1289</th>\n",
       "      <td>True</td>\n",
       "      <td>entropy</td>\n",
       "      <td>8</td>\n",
       "      <td>18</td>\n",
       "      <td>14</td>\n",
       "      <td>0.867907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>965</th>\n",
       "      <td>True</td>\n",
       "      <td>entropy</td>\n",
       "      <td>6</td>\n",
       "      <td>16</td>\n",
       "      <td>10</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>285</th>\n",
       "      <td>True</td>\n",
       "      <td>gini</td>\n",
       "      <td>6</td>\n",
       "      <td>23</td>\n",
       "      <td>10</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1245</th>\n",
       "      <td>True</td>\n",
       "      <td>entropy</td>\n",
       "      <td>8</td>\n",
       "      <td>14</td>\n",
       "      <td>10</td>\n",
       "      <td>0.867727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2431</th>\n",
       "      <td>False</td>\n",
       "      <td>entropy</td>\n",
       "      <td>6</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>0.867546</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>636</th>\n",
       "      <td>True</td>\n",
       "      <td>gini</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>11</td>\n",
       "      <td>0.862306</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>665</th>\n",
       "      <td>True</td>\n",
       "      <td>gini</td>\n",
       "      <td>9</td>\n",
       "      <td>16</td>\n",
       "      <td>10</td>\n",
       "      <td>0.862306</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2979</th>\n",
       "      <td>False</td>\n",
       "      <td>entropy</td>\n",
       "      <td>9</td>\n",
       "      <td>22</td>\n",
       "      <td>14</td>\n",
       "      <td>0.861944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>701</th>\n",
       "      <td>True</td>\n",
       "      <td>gini</td>\n",
       "      <td>9</td>\n",
       "      <td>20</td>\n",
       "      <td>6</td>\n",
       "      <td>0.861583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2120</th>\n",
       "      <td>False</td>\n",
       "      <td>gini</td>\n",
       "      <td>9</td>\n",
       "      <td>12</td>\n",
       "      <td>5</td>\n",
       "      <td>0.861583</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3000 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      oob_score criterion  max_depth  min_samples_split  min_samples_leaf  \\\n",
       "1289       True   entropy          8                 18                14   \n",
       "965        True   entropy          6                 16                10   \n",
       "285        True      gini          6                 23                10   \n",
       "1245       True   entropy          8                 14                10   \n",
       "2431      False   entropy          6                 13                 6   \n",
       "...         ...       ...        ...                ...               ...   \n",
       "636        True      gini          9                 13                11   \n",
       "665        True      gini          9                 16                10   \n",
       "2979      False   entropy          9                 22                14   \n",
       "701        True      gini          9                 20                 6   \n",
       "2120      False      gini          9                 12                 5   \n",
       "\n",
       "         score  \n",
       "1289  0.867907  \n",
       "965   0.867727  \n",
       "285   0.867727  \n",
       "1245  0.867727  \n",
       "2431  0.867546  \n",
       "...        ...  \n",
       "636   0.862306  \n",
       "665   0.862306  \n",
       "2979  0.861944  \n",
       "701   0.861583  \n",
       "2120  0.861583  \n",
       "\n",
       "[3000 rows x 6 columns]"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(lst_rf).sort_values('score', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "d9a3680b",
   "metadata": {},
   "outputs": [],
   "source": [
    "score_rf = RandomForestClassifier(oob_score=True, \n",
    "                                  criterion='entropy', \n",
    "                                  max_depth=8, \n",
    "                                  min_samples_split=18, \n",
    "                                  min_samples_leaf=14).fit(x_train, y_train).score(x_test, y_test)\n",
    "dic_score['score_rf'] = score_rf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "758b88af",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "b808dd61",
   "metadata": {},
   "source": [
    "#### adaboost(决策树版)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "984d0d14",
   "metadata": {},
   "outputs": [],
   "source": [
    "lst_ab = []\n",
    "for al in ['SAMME', 'SAMME.R']:\n",
    "    for cri in ['gini', 'entropy']:\n",
    "        for depth in range(5, 10):\n",
    "            for samples_split in range(10, 25):\n",
    "                for samples_leaf in range(5, 15):\n",
    "                    dt = DecisionTreeClassifier(\n",
    "                        criterion=cri, \n",
    "                        max_depth=depth, \n",
    "                        min_samples_split=samples_split, \n",
    "                        min_samples_leaf=samples_leaf\n",
    "                    )\n",
    "                    model_ab = AdaBoostClassifier(base_estimator=dt, algorithm=al).fit(x_train, y_train)\n",
    "                    \n",
    "                    dic_ab = {\n",
    "                        'algorithm': al, \n",
    "                        'criterion': cri, \n",
    "                        'max_depth': depth, \n",
    "                        'min_samples_split': samples_split, \n",
    "                        'min_samples_leaf': samples_leaf, \n",
    "                        'score': model_ab.score(x_test, y_test)\n",
    "                    }\n",
    "                    lst_ab.append(dic_ab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "fc880b44",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>algorithm</th>\n",
       "      <th>criterion</th>\n",
       "      <th>max_depth</th>\n",
       "      <th>min_samples_split</th>\n",
       "      <th>min_samples_leaf</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>750</th>\n",
       "      <td>SAMME</td>\n",
       "      <td>entropy</td>\n",
       "      <td>5</td>\n",
       "      <td>10</td>\n",
       "      <td>5</td>\n",
       "      <td>0.867185</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>885</th>\n",
       "      <td>SAMME</td>\n",
       "      <td>entropy</td>\n",
       "      <td>5</td>\n",
       "      <td>23</td>\n",
       "      <td>10</td>\n",
       "      <td>0.865739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>770</th>\n",
       "      <td>SAMME</td>\n",
       "      <td>entropy</td>\n",
       "      <td>5</td>\n",
       "      <td>12</td>\n",
       "      <td>5</td>\n",
       "      <td>0.864655</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>780</th>\n",
       "      <td>SAMME</td>\n",
       "      <td>entropy</td>\n",
       "      <td>5</td>\n",
       "      <td>13</td>\n",
       "      <td>5</td>\n",
       "      <td>0.864655</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>790</th>\n",
       "      <td>SAMME</td>\n",
       "      <td>entropy</td>\n",
       "      <td>5</td>\n",
       "      <td>14</td>\n",
       "      <td>5</td>\n",
       "      <td>0.864655</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1982</th>\n",
       "      <td>SAMME.R</td>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>13</td>\n",
       "      <td>7</td>\n",
       "      <td>0.835743</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1952</th>\n",
       "      <td>SAMME.R</td>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>7</td>\n",
       "      <td>0.835562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2070</th>\n",
       "      <td>SAMME.R</td>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>22</td>\n",
       "      <td>5</td>\n",
       "      <td>0.835562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2072</th>\n",
       "      <td>SAMME.R</td>\n",
       "      <td>gini</td>\n",
       "      <td>8</td>\n",
       "      <td>22</td>\n",
       "      <td>7</td>\n",
       "      <td>0.835201</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2101</th>\n",
       "      <td>SAMME.R</td>\n",
       "      <td>gini</td>\n",
       "      <td>9</td>\n",
       "      <td>10</td>\n",
       "      <td>6</td>\n",
       "      <td>0.835020</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3000 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     algorithm criterion  max_depth  min_samples_split  min_samples_leaf  \\\n",
       "750      SAMME   entropy          5                 10                 5   \n",
       "885      SAMME   entropy          5                 23                10   \n",
       "770      SAMME   entropy          5                 12                 5   \n",
       "780      SAMME   entropy          5                 13                 5   \n",
       "790      SAMME   entropy          5                 14                 5   \n",
       "...        ...       ...        ...                ...               ...   \n",
       "1982   SAMME.R      gini          8                 13                 7   \n",
       "1952   SAMME.R      gini          8                 10                 7   \n",
       "2070   SAMME.R      gini          8                 22                 5   \n",
       "2072   SAMME.R      gini          8                 22                 7   \n",
       "2101   SAMME.R      gini          9                 10                 6   \n",
       "\n",
       "         score  \n",
       "750   0.867185  \n",
       "885   0.865739  \n",
       "770   0.864655  \n",
       "780   0.864655  \n",
       "790   0.864655  \n",
       "...        ...  \n",
       "1982  0.835743  \n",
       "1952  0.835562  \n",
       "2070  0.835562  \n",
       "2072  0.835201  \n",
       "2101  0.835020  \n",
       "\n",
       "[3000 rows x 6 columns]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(lst_ab).sort_values('score', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "bba66629",
   "metadata": {},
   "outputs": [],
   "source": [
    "dt = DecisionTreeClassifier(criterion='entropy', max_depth=5, min_samples_split=10, min_samples_leaf=5)\n",
    "score_ab = AdaBoostClassifier(base_estimator=dt, algorithm='SAMME').fit(x_train, y_train).score(x_test, y_test)\n",
    "\n",
    "dic_score['score_ab'] = score_ab"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f53d4c9d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "b1210553",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'score_rf'"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 准确度最高模型\n",
    "max(dic_score)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d184773b",
   "metadata": {},
   "source": [
    "# 6. 最优模型&交叉验证"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02d4b8e5",
   "metadata": {},
   "source": [
    "#### 最优模型\n",
    "- 随机森林"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "3760af9f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8648355619804843"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 最优模型\n",
    "model_best = RandomForestClassifier(oob_score=True, \n",
    "                                  criterion='entropy', \n",
    "                                  max_depth=8, \n",
    "                                  min_samples_split=18, \n",
    "                                  min_samples_leaf=14)\n",
    "model_best.fit(x_train, y_train).score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a91ab9d",
   "metadata": {},
   "source": [
    "#### 交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "b15e1703",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.862936661987532"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(model_best, data_to_split.iloc[:, :-1], data_to_split['是否违约'], cv=5).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "288f0dcd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0018988999929522299"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "0.8648355619804843-0.862936661987532"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2f803e9",
   "metadata": {},
   "source": [
    "最优模型的准确度和交叉验证相差0.19%, 相差较小, 可以使用模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1fbeab57",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
